如何判断CQLEngine是否通过Model类Save进行插入或更新

时间:2015-03-03 18:43:37

标签: python cassandra-2.0 cqlengine

我正在使用Python3.4和CQLEngine。在我的代码中,我将一个对象保存在一个重载的保存操作符中,如下所示:

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

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

我想知道save()是否从保存函数的返回进行插入或更新。

1 个答案:

答案 0 :(得分:1)

INSERTUPDATE是Cassandra的同义词,只有极少数例外。这是一个description of INSERT,它简要介绍了差异:

  

INSERT将一个或多个列写入Cassandra表中的记录   原子地和孤立地。没有返回结果。你没有   定义除组成键的那些列之外的所有列。失踪   列在磁盘上不占用空间。

     

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

您不知道它是插入还是更新,您可以将其视为数据保存请求,然后协调员确定它是什么。

这回答了您的原始问题 - 根据保存功能的返回,您无法知道它是插入还是更新。

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

INSERT ... IF NOT EXISTS后跟UPDATE ... IF EXISTS

在目标表中,您需要有一个列,其中每个语句都会为每个调用写一个唯一的值。然后,您可以根据数据集的主键选择数据,并查看每个值的rown值。这将粗略地告诉您有多少更新和有多少插入。但是,如果有任何并发​​进程,它们可能会用它们的标记覆盖你的数据,所以这个方法不会非常准确,并且只有在没有并发进程的情况下才会起作用(就像Cassandra这样的数据库)。