Cassandra 抽象模型无法用聚类顺序定义 primary_key
Cassandra abstract model cant define primary_key with clustering order
我正在 python 中创建 cassandra 模型,下面是我的代码
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?
我正在 python 中创建 cassandra 模型,下面是我的代码
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?