Абстрактная модель Кассандры не может определить primary_key с порядком кластеризации

Я создаю модели Cassandra в Python, ниже мой код

from uuid import uuid4
from uuid import uuid1

from cassandra.cqlengine import columns, connection
from cassandra.cqlengine.models import Model
from cassandra.cqlengine.management import sync_table


class BaseModel(Model):
    __abstract__ = True

    deleted = columns.Boolean(required=True, default=False)
    created_timestamp = columns.TimeUUID(primary_key=True,
                                         clustering_order='DESC',
                                         default=uuid1)

class OtherModel(BaseModel):
    __table_name__ = 'other_table'
    id = columns.UUID(primary_key=True, default=uuid4)



if __name__ == '__main__':
    connection.setup(hosts=['localhost'],
                     default_keyspace='test')
    sync_table(OtherModel)

Это дает ошибку

python /tmp/test.py
Traceback (most recent call last):
  File "/tmp/test.py", line 9, in <module>
    class BaseModel(Model):
  File "/usr/lib/python2.7/site-packages/cassandra/cqlengine/models.py", line 905, in __new__
    raise ModelException("clustering_order may be specified only for clustering primary keys")
cassandra.cqlengine.models.ModelException: clustering_order may be specified only for clustering primary keys

Если я оставлю комментарий clusturing_order тогда работает нормально.

class BaseModel(Model):
    __abstract__ = True

    deleted = columns.Boolean(required=True, default=False)
    created_timestamp = columns.TimeUUID(primary_key=True,
    #                                    clustering_order='DESC',
                                         default=uuid1)

Есть ли способ определить clusting_order в abstract учебный класс?

Я должен создать created_timestamp в каждой модели, поэтому я не могу переместить его в каждую модель.

1 ответ

Решение

ПЕРВИЧНЫЙ КЛЮЧ в Кассандре состоит из двух компонентов: ключа раздела и ключа кластеризации. Ключ раздела определяет, на каком узле кластера будет храниться строка. Ключ кластеризации определяет порядок сортировки на диске строк в этом ключе раздела.

Также важно отметить, но ключи разделов не могут быть заказаны. Результаты многосегментного ключа всегда возвращаются в порядке их хешированного значения токена.

Похоже, ваша базовая модель имеет только один столбец (created_timestamp) определяется как ключ, поэтому это ваш ключ раздела. Я не вижу другого определенного ключа, поэтому у вас нет ключа кластеризации, и поэтому вы не можете применить clustering_order,

В Cassandra вам нужно определить свои таблицы в соответствии с запросами, которые вы намереваетесь обслуживать. Не видя ваших запросов, трудно сказать вам, как это исправить. Но, по сути, вам нужно использовать другой ключ раздела и назначить created_timestamp в качестве ключа кластеризации, чтобы получить желаемые результаты.

Для получения дополнительной информации, вы должны прочитать ответ Карло здесь:

Разница между ключом раздела, составным ключом и ключом кластеризации в Cassandra?

Другие вопросы по тегам