我正在使用Python3.4和CQLEngine。在我的代码中,我将一个对象保存在一个重载的保存操作符中,如下所示:
Class Foo(Model, ...):
id = columns.Integer(primary_key)=True
bar = column.Text()
...
def save(self):
super(Foo, self).save()
我想知道save()是否从保存函数的返回进行插入或更新。
答案 0 :(得分:1)
INSERT
和UPDATE
是Cassandra的同义词,只有极少数例外。这是一个description of INSERT
,它简要介绍了差异:
INSERT将一个或多个列写入Cassandra表中的记录 原子地和孤立地。没有返回结果。你没有 定义除组成键的那些列之外的所有列。失踪 列在磁盘上不占用空间。
如果列存在,则会更新。您可以通过限定表名 密钥空间。 INSERT不支持计数器,但UPDATE支持。 在内部,插入和更新操作是相同的。
您不知道它是插入还是更新,您可以将其视为数据保存请求,然后协调员确定它是什么。
这回答了您的原始问题 - 根据保存功能的返回,您无法知道它是插入还是更新。
下面你的评论的答案,它解释了为什么你想要输出:你无法从Cassandra中可靠地获取这些信息,但你可以在一定程度上使用轻量级事务并按顺序运行2个语句数据行:
INSERT ... IF NOT EXISTS
后跟UPDATE ... IF EXISTS
在目标表中,您需要有一个列,其中每个语句都会为每个调用写一个唯一的值。然后,您可以根据数据集的主键选择数据,并查看每个值的rown值。这将粗略地告诉您有多少更新和有多少插入。但是,如果有任何并发进程,它们可能会用它们的标记覆盖你的数据,所以这个方法不会非常准确,并且只有在没有并发进程的情况下才会起作用(就像Cassandra这样的数据库)。