0

Scala用のPhantom DSLドライバーを使用してCassandra DBにデータを保存する単純なScala Playアプリを構築しています。Cassandra の優れた機能の 1 つは、部分的な更新を実行できることです。つまり、キー列を指定する限り、テーブル内の他のすべての列に値を指定する必要はありません。Cassandra は、キーに基づいてデータを既存のレコードにマージします。

残念ながら、これは Phantom DSL では動作しないようです。複数の列を持つテーブルがあり、キーとデータ列の 1 つだけに値を指定して更新できるようにしたいと考えています。他のすべてのデータ列はそのままにして、通常どおり Cassandra にこれをレコードにマージさせます。そのレコードは変更されていません。

ただし、挿入/更新ステートメントで値を指定しない場合、Phantom DSL は既存の列を null で上書きします。

これに対する回避策を知っている人はいますか?最終的にデータ列が非常に大きくなるため、毎回すべてのデータ列を読み書きする必要はありません。

参考までに、Phantom コーディングには次の例と同じアプローチを使用しています。

https://github.com/thiagoandrade6/cassandra-phantom/blob/master/src/main/scala/com/cassandra/phantom/modeling/model/GenericSongsModel.scala

4

1 に答える 1

2

いくつかのコードを表示するのは素晴らしいことですが、phantom では部分的な更新が可能です。Phantom は不変のビルダーであり、デフォルトでは null で何もオーバーライドしません。値を指定しない場合、それについては何もしません。

database.table.update.where(_.id eqs id).update(_.bla setTo "newValue")

明示的に何かに設定した値のみが null に設定されるクエリが生成されます。いくつかのコード例を提供してください。クエリがテーブルの列を追跡して不足しているものを自動的に追加しないため、問題は本当に奇妙に思えます。

アップデート

基本的に Cassandra 内に設定するなど、列の値を削除したい場合null、phantom は同じことを行う別の構文を提供します。

database.table.delete(_.col1, _.col2).where(_.id eqs id)`

さらに、同じ方法でマップ エントリを削除することもできます。

database.table.delete(_.props("test"), _.props("test2").where(_.id eqs id)

props) はタイプセーフであるため、これは aMapColumn[Table, Record, String, _]であると想定しprops.apply(key: Tているため、マップ列に定義したキータイプが尊重されます。

于 2016-05-06T14:27:38.150 に答える