我可以在Slick中选择一行也保证是唯一返回的行吗?

时间:2015-11-06 04:28:47

标签: scala playframework slick slick-3.0

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

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

1 个答案:

答案 0 :(得分:3)

我不知道为此做了什么。您可以做的是编写一个将采取操作的方法,检查结果是否恰好是一行,如果不是,则会失败。

这可能只是一个简单的旧方法,你绕着一个动作。或者,我们可以丰富一个动作,这样就可以成为你对动作的召唤。这是我的意思的一个例子:

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,您将在运行时获得一个结果或错误。