2016-12-27 4 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) 

После этого я добавил новый столбец name в OtherModel и запустить ту же программу.

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') 

Когда проверка дб запись

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) 

Существует один ряд с name как null.

Но я не могу запросить значение 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

Спасибо Крис, моя проблема в том, что когда я делаю запрос с 'name = XYZ', я также хочу получить данные для' null', есть ли способ получить данные с этим? – Nilesh

+0

Для подобных ситуаций подумайте об использовании Spark. Без него нет даже способа запросить имя = XYZ с этой схемой, если вы не создадите новую таблицу, материализованное представление или вторичный индекс. Обратите внимание, что MVs, и особенно 2is, имеют негативные последствия, и я рекомендую вам использовать их только после того, как вы полностью осознаете, как они работают, чтобы убедиться, что вы не сожжены. Id рекомендует новую таблицу здесь fwiw. Cassandra предназначен для огромных массивов данных, которые широко распространены, поэтому такие запросы, как запрос на любую часть данных, не поддерживаются, потому что они не будут работать во многих сценариях. Схема должна поддерживать запрос. –

+0

Спасибо Крис, позвольте мне проверить, как я могу это решить :) – Nilesh

 Смежные вопросы

  • Нет связанных вопросов^_^