2016-12-23 3 views
0
내가 파이썬에서 모델을 만드는 오전

, 아래에있는 내 코드입니다카산드라 추상 모델은 클러스터링 주문 primary_key와 정의하지 못할

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) 

이 그때 clusturing_order의 작업에 주석을 넣으면 오류

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 

제공 벌금.

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 클래스 clusting_order를 정의하는 방법은 없나요?

각 모델마다 created_timestamp을 만들어야 각 모델로 이동할 수 없습니다.

답변

2

Cassandra의 기본 키에는 파티션 키와 클러스터링 키의 두 가지 구성 요소가 있습니다. 파티션 키는 행이 저장 될 클러스터의 노드를 판별합니다. 클러스터링 키는 행의 디스크상의 정렬 순서를 내에서 파티션 키로 결정합니다.

메모도 중요하지만 파티션 키 으로 주문할 수 없습니다. 다중 파티션 키 결과는 해시 된 토큰 값의 순서로 항상 리턴됩니다.

기본 모델에는 키로 정의 된 하나의 열 (created_timestamp) 만있는 것처럼 보입니다. 따라서 그것은 파티션 키입니다. 정의 된 다른 키가 표시되지 않으므로 클러스터링 키가 없으므로 clustering_order을 적용 할 수 없습니다.

카산드라에서는 제공하려는 쿼리에 따라 테이블을 정의해야합니다. 귀하의 질의를 보지 않고서는이를 고치는 방법을 알려주는 것이 어렵습니다. 하지만 기본적으로 다른 파티션 키를 사용하고 원하는 결과를 얻으려면 created_timestamp을 클러스터링 키로 지정해야합니다.

자세한 내용은 여기 카를로의 답변을 읽어야

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