部分插入Cassandra和Phantom DSL

时间:2016-05-06 12:51:29

标签: scala cassandra phantom-dsl

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

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

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

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

仅供参考我使用与我的Phantom编码相同的方法,如下例所示:

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

1 个答案:

答案 0 :(得分:2)

看到一些代码会很棒,但幻像可以进行部分更新。 Phantom是一个不可变的构建器,默认情况下它不会覆盖任何null。如果你没有指定一个值,它就不会对它做任何事情。

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

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

<强>更新

如果你想删除列值,例如基本上将它们设置为Cassandra中的null,幻像提供了不同的语法,可以做同样的事情:

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

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

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

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