我已经使用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],它没有任何方法来获取整数值。我错过了一些隐含的导入吗?
答案 0 :(得分:3)
正如您可能已经意识到的那样,run
调用的结果是生成Future
,它将在稍后解决。
虽然这意味着最终在代码的某个地方,未来需要以你在答案中显示的方式等待,这可以而且应该尽可能晚地推迟。如果您正在使用Play框架,请使用异步操作并让Play为您处理。
与此同时使用Future
和任何其他monadic构造(例如Option
)一样工作 - 调用map
,flatMap
,onSuccess
等等在传播的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)