Ключ раздела должен быть определен для запросов на удаление в 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

Выполнение эквивалента "delete all" приведет к полному сканированию таблицы и неэффективно в Cassandra, поэтому вы можете удалить только определенный раздел, указав ключ раздела. Основной оператор CQL эквивалентен следующему:

DELETE FROM table_name WHERE pk = ?

Но когда вы пытаетесь сделать "delete all", это не работает в Cassandra, поскольку DELETE должен быть ограничен разделом с помощью предложения WHERE, поэтому это не работает и в Django-Cassandra.

Если вам не нужны данные в таблице, вместо этого подключитесь к экземпляру Cassandra напрямую с помощью cqlsh и выдайте команду TRUNCATE. Будьте здоровы!

Вернуться на верх