如何在Slick 3.0中COUNT(*)?

时间:2015-09-04 19:12:22

标签: scala slick 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
}

但是这段代码将返回一个slick.lifted.Rep [Int],它没有任何方法来获取整数值。我错过了一些隐含的导入吗?

2 个答案:

答案 0 :(得分:3)

正如您可能已经意识到的那样,run调用的结果是生成Future,它将在稍后解决。

虽然这意味着最终在代码的某个地方,未来需要以你在答案中显示的方式等待,这可以而且应该尽可能晚地推迟。如果您正在使用Play框架,请使用异步操作并让Play为您处理。

与此同时使用Future和任何其他monadic构造(例如Option)一样工作 - 调用mapflatMaponSuccess等等在传播的Future上下文中链接您的计算。

答案 1 :(得分:1)

请有人告诉我有更好的方法来回答我的问题。我这样做了,但这看起来很可怕:

import scala.concurrent.duration._
import scala.concurrent.Await
val timeout = Duration(10, SECONDS)
val count = Await.result(connection.run(coffees.length.result), timeout)