0

我正在构建一个简单的 Scala Play 应用程序,它使用 Scala 的 Phantom DSL 驱动程序将数据存储在 Cassandra DB 中。Cassandra 的优点之一是您可以进行部分更新,即只要您提供键列,您就不必为表中的所有其他列提供值。Cassandra 将根据密钥将数据合并到您现有的记录中。

不幸的是,这似乎不适用于 Phantom DSL。我有一个包含几列的表,我希望能够进行更新,仅为键和数据列之一指定值,并让 Cassandra 像往常一样将其合并到记录中,同时保留所有其他数据列对于该记录不变。

但是,如果您未在插入/更新语句中指定值,Phantom DSL 会用 null 覆盖现有列。

有人知道解决方法吗?我不想每次都读取/写入所有数据列,因为最终数据列会非常大。

仅供参考,我使用与以下示例相同的方法进行幻像编码:

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

4

1 回答 1

2

很高兴看到一些代码,但部分更新是可能的幻影。Phantom 是一个不可变的构建器,默认情况下它不会用 null 覆盖任何东西。如果你不指定一个值,它不会做任何事情。

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

将生成一个查询,其中只有您明确设置的值将设置为空。请提供一些代码示例,您的问题似乎很奇怪,因为查询不会跟踪表列以自动添加缺少的内容。

更新

如果您想删除列值,例如null基本上将它们设置到 Cassandra 内部,phantom 提供了一种不同的语法来做同样的事情:

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

此外,您甚至可以以相同的方式删除地图条目:

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

这假设props是 a MapColumn[Table, Record, String, _],因为props.apply(key: T) 是类型安全的,因此它将尊重您为 map 列定义的键类型。

于 2016-05-06T14:27:38.150 回答