gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:41:00 24 4
gpt4 key购买 nike

尽管文档说您可以编译更新,但我无法让 Slick 3.1 编译更新,其中要更新的值被传递到已编译的 block 中。

对于我的用例,我想找到具有给定键的行,其中停用为空,并将停用时间设置为新的时间戳。

我想做的显而易见的事情是:

  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 .

最佳答案

你做 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))
}

事实证明,当你这样做 Compiled , Slick 实际上创建了四个不同的编译目标,用于插入、更新、删除和选择。每个特定的表格都是在首次使用时完全编译的。您可以在 API for CompiledFunction 中明确看到这一点。 .

关于scala - 如何在 Slick 3.1 中编译参数化更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38260873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com