如何在 Slick 3.0 中计算 (*)?
How to COUNT(*) in Slick 3.0?
我使用 Slick 已经有一段时间了,现在我正在从 Slick 2.1 迁移到 3.0。不幸的是,我被普通的东西困住了,比如数线。当我以前这样做时,我的代码在 Slick 2.1 中工作得很好:
connection.withSession {
implicit session => coffees.length.run
}
在上面的代码中,我会得到一个 Int 形式的结果,但是在我移动到 Slick 3.0.2 后我现在无法让它工作 though the documentation tells me that the code should be the same。
我尝试了以下方法(我已经删除了不推荐使用的 withSession 调用):
connection.createSession.withTransaction {
coffees.length
}
但是这段代码将return一个slick.lifted.Rep[Int],它没有任何方法来获取整数值。我是否遗漏了一些隐式导入?
拜托,有人告诉我有更好的方法来回答我的问题。我让它工作了,但这看起来很糟糕:
import scala.concurrent.duration._
import scala.concurrent.Await
val timeout = Duration(10, SECONDS)
val count = Await.result(connection.run(coffees.length.result), timeout)
正如您可能已经意识到的那样,run
调用的结果是生成一个 Future
,它将在稍后解析。
虽然这意味着最终代码中的某个地方需要以您在答案中显示的方式等待未来,但这可以而且应该尽可能晚地推迟。例如,如果您正在使用 Play 框架,请使用异步操作并让 Play 为您处理。
与此同时使用 Future
就像使用任何其他 monadic 构造(如 Option
)一样 - 调用 map
、flatMap
、onSuccess
依此类推,将您的计算链接到传播的 Future
上下文中。
我使用 Slick 已经有一段时间了,现在我正在从 Slick 2.1 迁移到 3.0。不幸的是,我被普通的东西困住了,比如数线。当我以前这样做时,我的代码在 Slick 2.1 中工作得很好:
connection.withSession {
implicit session => coffees.length.run
}
在上面的代码中,我会得到一个 Int 形式的结果,但是在我移动到 Slick 3.0.2 后我现在无法让它工作 though the documentation tells me that the code should be the same。
我尝试了以下方法(我已经删除了不推荐使用的 withSession 调用):
connection.createSession.withTransaction {
coffees.length
}
但是这段代码将return一个slick.lifted.Rep[Int],它没有任何方法来获取整数值。我是否遗漏了一些隐式导入?
拜托,有人告诉我有更好的方法来回答我的问题。我让它工作了,但这看起来很糟糕:
import scala.concurrent.duration._
import scala.concurrent.Await
val timeout = Duration(10, SECONDS)
val count = Await.result(connection.run(coffees.length.result), timeout)
正如您可能已经意识到的那样,run
调用的结果是生成一个 Future
,它将在稍后解析。
虽然这意味着最终代码中的某个地方需要以您在答案中显示的方式等待未来,但这可以而且应该尽可能晚地推迟。例如,如果您正在使用 Play 框架,请使用异步操作并让 Play 为您处理。
与此同时使用 Future
就像使用任何其他 monadic 构造(如 Option
)一样 - 调用 map
、flatMap
、onSuccess
依此类推,将您的计算链接到传播的 Future
上下文中。