使用 Cassandra 和 Phantom DSL 进行部分插入

Partial inserts with Cassandra and Phantom DSL

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

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

但是如果您没有在 insert/update 语句中指定值,Phantom DSL 会用 null 覆盖现有列。

有人知道解决这个问题的方法吗?我不想每次都 read/write 所有数据列,因为最终数据列会非常大。

仅供参考,我使用与这些示例中相同的 Phantom 编码方法:

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

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

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

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

更新

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

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

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

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

这假设 props 是一个 MapColumn[Table, Record, String, _],因为 props.apply(key: T) 是类型安全的,因此它将遵循您为映射列定义的键类型。