Cassandra 抽象模型无法用聚类顺序定义 primary_key

Cassandra abstract model cant define primary_key with clustering order

我正在 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)

有什么方法可以在 abstract class 中定义 clusting_order 吗?

我必须在每个模型中创建 created_timestamp,所以我无法将其移动到每个模型中。

Cassandra 中的主键有两个组成部分:分区键和集群键。分区键决定了该行将存储在集群中的哪个或哪些节点上。集群键决定分区键内行的磁盘排序顺序。

同样需要注意的是,分区键不能被排序。多分区键结果始终按其散列标记值的顺序返回。

您的基本模型似乎只有一列 (created_timestamp) 定义为键,因此这是您的分区键。我没有看到另一个键被定义,所以你没有集群键,因此你不能应用 clustering_order.

在 Cassandra 中,您需要根据您打算提供的查询来定义表。没有看到您的查询,很难告诉您如何解决这个问题。但本质上,您需要使用不同的分区键并将 created_timestamp 指定为聚类键才能获得所需的结果。

有关更多信息,您应该在此处阅读 Carlo 的回答:

Difference between partition key, composite key and clustering key in Cassandra?