分区键必须在 django-cassandra-engine 中的删除查询中定义
The partition key must be defined on delete queries in django-cassandra-engine
from django.utils import timezone
from cassandra.cqlengine import columns
from django_cassandra_engine.models import DjangoCassandraModel
class RequestResponse(DjangoCassandraModel):
id = columns.UUID(primary_key=True, default=uuid.uuid4)
sel_no = columns.Text(index=True)
transaction_type = columns.Text()
created_at = columns.DateTime(default=timezone.now())
updated_at = columns.DateTime(default=timezone.now())
我正在使用 django-cassandra-engine==1.6.1。当我试图从此模型中删除我的所有数据时,发生了这些错误。我的命令行:
RequestResponse.objects.all().count()
>> 10123
RequestResponse.objects.all().delete()
然后就出现了这些错误。
996 partition_keys = set(x.db_field_name for x in self.model._partition_keys.values())
997 if partition_keys - set(c.field for c in self._where):
--> 998 raise QueryException("The partition key must be defined on delete queries")
999
1000 dq = DeleteStatement(
QueryException: The partition key must be defined on delete queries
执行相当于“全部删除”的操作将导致完整 table 扫描,并且在 Cassandra 中效率不高,因此您只能通过提供分区键来删除特定分区。底层 CQL 语句等同于:
DELETE FROM table_name WHERE pk = ?
但是当您尝试执行“全部删除”时,它在 Cassandra 中无效,因为 DELETE
必须使用 WHERE
子句限制在一个分区中,因此它不是在 Django-Cassandra 中也无效。
如果您不需要或不想要 table 中的数据,您应该直接使用 cqlsh 连接到您的 Cassandra 实例并发出 TRUNCATE
。干杯!
from django.utils import timezone
from cassandra.cqlengine import columns
from django_cassandra_engine.models import DjangoCassandraModel
class RequestResponse(DjangoCassandraModel):
id = columns.UUID(primary_key=True, default=uuid.uuid4)
sel_no = columns.Text(index=True)
transaction_type = columns.Text()
created_at = columns.DateTime(default=timezone.now())
updated_at = columns.DateTime(default=timezone.now())
我正在使用 django-cassandra-engine==1.6.1。当我试图从此模型中删除我的所有数据时,发生了这些错误。我的命令行:
RequestResponse.objects.all().count()
>> 10123
RequestResponse.objects.all().delete()
然后就出现了这些错误。
996 partition_keys = set(x.db_field_name for x in self.model._partition_keys.values())
997 if partition_keys - set(c.field for c in self._where):
--> 998 raise QueryException("The partition key must be defined on delete queries")
999
1000 dq = DeleteStatement(
QueryException: The partition key must be defined on delete queries
执行相当于“全部删除”的操作将导致完整 table 扫描,并且在 Cassandra 中效率不高,因此您只能通过提供分区键来删除特定分区。底层 CQL 语句等同于:
DELETE FROM table_name WHERE pk = ?
但是当您尝试执行“全部删除”时,它在 Cassandra 中无效,因为 DELETE
必须使用 WHERE
子句限制在一个分区中,因此它不是在 Django-Cassandra 中也无效。
如果您不需要或不想要 table 中的数据,您应该直接使用 cqlsh 连接到您的 Cassandra 实例并发出 TRUNCATE
。干杯!