0

Python3.4 と CQLEngine を使用しています。私のコードでは、次のように、オーバーロードされた保存演算子でオブジェクトを保存しています。

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

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

save() が save 関数の戻り値から挿入または更新を行っているかどうかを知りたいです。

4

1 に答える 1

1

INSERTおよびUPDATEは、ごくわずかな例外を除いて、Cassandra では同義語です。ここでは、違いに簡単に触れている場所の説明を示します。INSERT

INSERT は、Cassandra テーブルのレコードに 1 つ以上の列をアトミックかつ分離して書き込みます。結果は返されません。キーを構成する列を除いて、すべての列を定義する必要はありません。欠落している列は、ディスク上のスペースを占有しません。

列が存在する場合は、更新されます。テーブル名はキースペースで修飾できます。INSERT はカウンターをサポートしていませんが、UPDATE はサポートしています。内部的には、挿入操作と更新操作は同じです。

それが挿入なのか更新なのかはわかりませんが、あたかもそれがデータ保存要求であるかのように見ることができ、コーディネーターがそれが何であるかを判断します。

これは元の質問に答えます-save関数の戻りに基づいて、それが挿入か更新かを知ることはできません。

以下のコメントに対する回答で、その出力が必要な理由が説明されています。Cassandra からこの情報を確実に取得することはできませんが、軽量トランザクションをある程度使用して、同じデータ行で 2 つのステートメントを連続して実行することはできます。 :

INSERT ... IF NOT EXISTSに続くUPDATE ... IF EXISTS

ターゲット テーブルには、これらの各ステートメントが呼び出しごとに一意の値を書き込む列が必要です。次に、データセットの主キーに基づいてデータを選択し、各値を持つ行数を確認できます。これにより、更新の数と挿入の数が大まかにわかります。ただし、同時プロセスがあったとしても、データがトークンで上書きされた可能性があるため、この方法はあまり正確ではなく、(Cassandra などのデータベースでの他の方法と同様に) 同時プロセスがない場合にのみ機能します。

于 2015-03-03T19:31:48.247 に答える