我正在构建一个简单的Scala Play应用程序,该应用程序使用Scala的Phantom DSL驱动程序将数据存储在Cassandra数据库中。 Cassandra的一个很好的功能是你可以进行部分更新,即只要提供键列,就不必为表中的所有其他列提供值。 Cassandra会根据密钥将数据合并到您现有的记录中。
不幸的是,这似乎与Phantom DSL无关。我有一个包含多个列的表,我希望能够进行更新,仅为密钥和一个数据列指定值,并让Cassandra像往常一样将其合并到记录中,同时保留所有其他数据列该记录保持不变。
但是如果你没有在insert / update语句中指定值,Phantom DSL会用null覆盖现有列。
有人知道这方面的解决方法吗?我不想每次都读/写所有数据列,因为最终数据列会非常大。
仅供参考我使用与我的Phantom编码相同的方法,如下例所示:
答案 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)
这假定props
是MapColumn[Table, Record, String, _]
,因为props.apply(key: T
)是类型安全的,因此它将尊重您为地图列定义的键类型。