0

I am using Python3.4 and CQLEngine. In my code, I am saving an object in an overloaded save operator as follows:

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

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

and I would like to know if the save() is making an insert or an update from the return of the save function.

4

1 回答 1

1

INSERT并且UPDATE是 Cassandra 中的同义词,只有极少数例外。以下是它简要说明不同之处的描述:INSERT

一个 INSERT 以原子方式和隔离的方式将一个或多个列写入 Cassandra 表中的记录。不返回任何结果。您不必定义所有列,构成键的列除外。缺少的列不占用磁盘空间。

如果该列存在,则对其进行更新。您可以通过键空间限定表名。INSERT 不支持计数器,但 UPDATE 支持。在内部,插入和更新操作是相同的。

你不知道它是插入还是更新,你可以把它看作是一个数据保存请求,然后协调器确定它是什么。

这回答了您最初的问题 - 您无法根据保存函数的返回来知道它是插入还是更新。

您在下面的评论中的答案,解释了您为什么想要该输出:您无法可靠地从 Cassandra 中获取此信息,但您可以在一定程度上使用轻量级事务并使用相同的数据行顺序运行 2 个语句:

INSERT ... IF NOT EXISTS其次是UPDATE ... IF EXISTS

在目标表中,您需要有一列,其中每个语句将为每个调用写入一个唯一的值。然后您可以根据数据集的主键选择数据,并查看每个值有多少行。这将大致告诉您有多少更新以及有多少插入。但是,如果有任何并发​​进程,它们可能已经用它们的令牌覆盖了您的数据,因此这种方法不会非常准确,并且仅在没有并发进程的情况下才有效(与任何其他使用 Cassandra 等数据库的方法一样)。

于 2015-03-03T19:31:48.247 回答