Как узнать, сделал ли CQLEngine вставку или обновление через класс Model

Я использую Python3.4 и CQLEngine. В моем коде я сохраняю объект в перегруженном операторе сохранения следующим образом:

Class Foo(Model, ...):
    id = columns.Integer(primary_key)=True
    bar = column.Text() 
    ...

    def save(self):
        super(Foo, self).save()

и я хотел бы знать, делает ли save() вставку или обновление после возврата функции сохранения.

1 ответ

INSERT а также UPDATE синонимы в Кассандре с очень немногими исключениями. Вот описаниеINSERT где это кратко затрагивает разницу:

INSERT записывает один или несколько столбцов в запись в таблице Cassandra атомарно и изолированно. Результаты не возвращаются. Вам не нужно определять все столбцы, кроме тех, которые составляют ключ. Отсутствующие столбцы не занимают места на диске.

Если столбец существует, он обновляется. Вы можете квалифицировать имена таблиц по пространству клавиш. INSERT не поддерживает счетчики, но UPDATE поддерживает. Внутренне операции вставки и обновления идентичны.

Вы не знаете, будет ли это вставка или обновление, и вы можете посмотреть на это, как если бы это был запрос на сохранение данных, тогда координатор определит, что это такое.

Это отвечает на ваш первоначальный вопрос - вы не можете узнать по возврату функции сохранения, была ли она вставкой или обновлением.

Ответ на ваш комментарий ниже, который объясняет, почему вы хотели получить такой вывод: вы не можете надежно получить эту информацию из Cassandra, но вы можете использовать легкие транзакции в определенной степени и выполнять 2 оператора последовательно с одними и теми же строками данных.:

INSERT ... IF NOT EXISTS с последующим UPDATE ... IF EXISTS

В целевой таблице у вас должен быть столбец, в котором каждое из этих выражений будет записывать уникальное значение для каждого вызова. Затем вы можете выбрать данные на основе первичных ключей вашего набора данных и посмотреть, сколько строк имеют каждое значение. Это примерно скажет вам, сколько обновлений и сколько было вставок. Однако, если были какие-то параллельные процессы, они могли перезаписать ваши данные своими токенами, поэтому этот метод не будет очень точным и будет работать (как любой другой метод с базами данных, такими как Cassandra) только там, где нет параллельных процессов.

Другие вопросы по тегам