【问题标题】:How to compile a parametrized update in Slick 3.1?如何在 Slick 3.1 中编译参数化更新?
【发布时间】: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 不会让我要求LiteralColumnCompiled 也不允许我将参数设置为 time: Instant

【问题讨论】:

    标签: scala slick-3.0


    【解决方案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))
      }
    

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

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多