2016-12-27 6 views
1

私は以下のようなコードを持っています。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 

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

class OtherModel(BaseModel): 
    __table_name__ = 'other_table' 



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

    OtherModel.create() 

最初の実行後、私はクエリを実行するとdbでレコードを見ることができます。

cqlsh> select * from test.other_table; 

id         | created_timestamp     | deleted 
--------------------------------------+--------------------------------------+--------- 
febc7789-5806-44d8-bbd5-45321676def9 | 840e1b66-cc73-11e6-a66c-38c986054a88 | False 

(1 rows) 

はこの後、私はOtherModelで、それを新しい列nameを追加し、同じプログラムを実行します。

class OtherModel(BaseModel): 
    __table_name__ = 'other_table' 
    name = columns.Text(required=True, default='') 




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

    OtherModel.create(name='test') 

nullとしてnameと一列であり、チェックDBエントリ

cqlsh> select * from test.other_table; 

id         | created_timestamp     | deleted | name 
--------------------------------------+--------------------------------------+---------+------ 
936cfd6c-44a4-43d3-a3c0-fdd493144f4b | 4d7fd78c-cc74-11e6-bb49-38c986054a88 | False | test 
febc7789-5806-44d8-bbd5-45321676def9 | 840e1b66-cc73-11e6-a66c-38c986054a88 | False | null 

(2 rows) 

しかし、私はnull値を照会できません。

cqlsh> select * from test.other_table where name=null; 
InvalidRequest: code=2200 [Invalid query] message="Unsupported null value for indexed column name" 

参考文献How Can I Search for Records That Have A Null/Empty Field Using CQL?があります。

モデルにdefault=''を設定すると、表のnullの値がすべて設定されていないのはなぜですか?

nullの値をnameに設定する方法はありますか?クエリのデフォルト値は''ですか?

答えて

2

ヌルセルは実際には設定されていません。データの欠如は、フィルタリング操作のために照会できるものではありません。スケーラブルではありませんし、効率的に実行することもできないため、C *が推奨するものではありません(この場合でも許可します)。

以前に作成されたすべての行に遡って値を設定すると、非常に高価になります(すべてを読み込み、次に書き込みを行う必要があります)。アプリケーション側でかなり簡単にif name is null its ''と言うだけです。

+0

Chrisさん、ありがとうございます。私の問題は、 'name = XYZ'を使ってクエリを作成したときに、' null 'のデータも取得したいのですが、そこでデータを取得する方法はありますか? – Nilesh

+0

このようなアドホックなことについては、Sparkの使用を検討してください。それがなければ、新しい表、マテリアライズド・ビュー、または2次索引を作成しないかぎり、このスキーマを使用してname = XYZを問い合せる方法もありません。 MVや特に2が悪影響を及ぼすことに注意してください。あなたが火傷をしていないことを確認するためにどのように働いているかを十分に理解してから使用することをお勧めします。ここでは新しいテーブルをお勧めします。 Cassandraは、大量に配布される巨大なデータセット用に設計されているため、多くのシナリオでは機能しないため、データの問合せなどのサポートはサポートされていません。スキーマはクエリをサポートする必要があります。 –

+0

クリスおかげで、私にチェックさせて、どのように私はこれを解決することができます:) – Nilesh

関連する問題