如何在Slick 3.1中编译参数化更新?

时间:2016-07-08 07:12:15

标签: scala slick-3.0

虽然文档说您可以编译更新,但是我无法使用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不会让我需要LiteralColumnCompiled也不允许我将参数设为time: Instant

1 个答案:

答案 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

中明确地看到这一点