虽然文档说您可以编译更新,但是我无法使用Slick 3.1来编译更新,其中要更新的值将传递到已编译的块中。
对于我的用例,我想找到一个带有给定键的行,其中去激活为空,并将去激活时间设置为新的时间戳。
我想要做的显而易见的事是:
private[this] lazy val updateDeactiveTime = Compiled { (settingName: Rep[String], time: Rep[Instant]) =>
settings
.filter { row => row.name === settingName && row.deactivatedAt.isEmpty }
.map { _.deactivatedAt }
.update(Some(time))
}
不幸的是,这让我抱怨update
无法接受Rep[Option[Instant]]
:它需要Option[Instant]
。
据我所知,Slick(不幸的是)不允许您在更新中使用动态计算的值。根据文档,限制操作等方法的解决方法是使用ConstColumn[…]
。尽职尽责,我尝试传递ConstColumn[Option[Instant]]
,希望有一些隐含的转换或扩展,但我仍然抱怨它必须是文字Option[Instant]
。
当然我有文字的瞬间,但是如果每次目标值改变时我都必须重新编译它,那么编译更新并没有什么意义。
如果我使用LiteralColumn[…]
,我可以致电_.value
,但Compiled
不会让我需要LiteralColumn
。 Compiled
也不允许我将参数设为time: Instant
。
答案 0 :(得分:3)
您执行编译的部分的<{1}}操作 。这仍然提供了编译的好处。
update
事实证明,当你执行 private[this] lazy val deactiveTime = Compiled { (settingName: Rep[String]) =>
settings
.filter { row => row.name === settingName && row.deactivatedAt.isEmpty }
.map { _.deactivatedAt }
}
def updateDeactiveTime(settingName: String, time: Instant) = {
deactiveTime(settingName).update(Some(time))
}
时,Slick实际上创建了四个不同的编译目标,它们将用于插入,更新,删除和选择。每个特定表单在首次使用时完全编译。您可以在API for CompiledFunction。