【发布时间】:2016-07-08 07:12:15
【问题描述】:
虽然文档说您可以编译更新,但我无法让 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。
【问题讨论】: