【问题标题】:Can I select a single row in Slick that is also guaranteed to be the only row returned?我可以在 Slick 中选择一个也保证是返回的唯一行的单行吗?
【发布时间】:2015-11-06 04:28:47
【问题描述】:

在 Slick 中,有 firstfirstOption 可以选择结果集的第一行。

是否有一个版本也可以保证这是唯一返回的行(这样如果数据集以某种方式破坏了我的应用程序所依赖的某些假设,我会得到一个异常)?

【问题讨论】:

  • 不确定您是否正在寻找能够在数据库上运行之前验证操作的东西(据我所知,这是不可能的),还是会在您的电话给您的不是预期的受影响的行数。如果是后者,你可能想看看activeslick's DBIOExtensions
  • @SeanVieira:后者。我想要许多其他 ORM 解决方案提供的相同功能来选择单行(选择 2,检查是否只有 1,如果太多则错误)

标签: scala playframework slick slick-3.0


【解决方案1】:

我不知道有什么内置的东西可以做到这一点。你可以做的是编写一个方法来执行操作,检查结果是否正好是一行,如果不是则失败。

这可能只是一种简单的旧方法,您可以围绕一个动作进行包装。或者,我们可以丰富一个动作,使其成为您对某个动作的调用。这是我的意思的一个例子:

implicit class ResultEnrichment[T](action: DBIO[Seq[T]]) {
  def exactlyOne: DBIO[T] = action.flatMap { xs =>
    xs.length match {
      case 1 => DBIO.successful(xs.head)
      case n => DBIO.failed(new RuntimeException(s"Expected 1 result, not $n"))
    }
  }
}

这个类被标记为隐式,所以只要有DBIO[Seq[T]],编译器就可以使用它。具体来说,它提供了一个exactlyOne 方法,编译器可以在Seq[T] 的任何操作上找到该方法。

exactlyOne 的结果是您可以运行的新操作。如果在运行时找不到正好一行,它将失败。

您可以像这样使用它来进行一些任意查询:

val query = table.filter(...).map(...) // whatever your query is
val action = query.result.exactlyOne

运行最后的action,你会在运行时得到一个结果或错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多