在Slick中,有first
和firstOption
来选择结果集的第一行。
是否还有一个版本可以保证这是唯一返回的行(如果数据集以某种方式违反了我的应用程序所依赖的某些假设,我会得到一个异常)?
答案 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
,您将在运行时获得一个结果或错误。