【问题标题】:The partition key must be defined on delete queries in django-cassandra-engine必须在 django-cassandra-engine 中的删除查询上定义分区键
【发布时间】:2021-10-24 10:40:33
【问题描述】:
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

【问题讨论】:

  • 截断可能是一个不错的选择,然后发出删除。 Cassandra 上的删除以特殊方式处理,因此如果您想删除表中的所有数据,更好的选择是截断表并继续。

标签: python django cassandra


【解决方案1】:

执行相当于“delete all”的操作会导致全表扫描,在 Cassandra 中效率不高,因此您只能通过提供分区键来删除特定分区。底层 CQL 语句等价于:

DELETE FROM table_name WHERE pk = ?

但是当您尝试执行“全部删除”时,它在 Cassandra 中无效,因为 DELETE 必须使用 WHERE 子句限制在分区中,因此它在 Django 中无效-卡桑德拉也是。

如果您不需要或不想要表中的数据,您应该直接使用 cqlsh 连接到您的 Cassandra 实例并发出 TRUNCATE。干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2023-04-09
    • 1970-01-01
    • 2018-11-14
    • 2014-01-21
    相关资源
    最近更新 更多