2016-12-23 10 views
0
私はPythonで モデルを作成しています

、以下の私のコードですカサンドラ抽象モデルは、クラスタリング順序で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のPRIMARY KEYには、パーティションキーとクラスタリングキーの2つのコンポーネントがあります。パーティションキーは、クラスタ内のどのノードに行が格納されるかを決定します。クラスタ化キーは、行のディスク上のソート順を決定します。内のパーティションキー。

注意することも重要ですが、パーティションキーに注文できません。マルチパーティションキーの結果は常に、ハッシュされたトークン値の順に返されます。

基本モデルのキー(created_timestamp)が1つしか定義されていないように見えます。それはあなたのパーティションキーです。別のキーが定義されていないので、クラスタリングキーがないので、clustering_orderを適用することはできません。

Cassandraでは、提供するクエリに応じてテーブルを定義する必要があります。あなたの質問を見ることなく、これを修正する方法を教えるのは難しいです。しかし基本的には、別のパーティションキーを使用して、希望の結果を得るためにクラスタリングキーとしてcreated_timestampを指定する必要があります。

詳細については、あなたはここにカルロの答えをお読みください:

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

関連する問題