【问题标题】:How to COUNT(*) in Slick 3.0?如何在 Slick 3.0 中计数(*)?
【发布时间】:2015-12-01 00:37:35
【问题描述】:

我使用 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] ,它没有任何方法来获取整数值。我错过了一些隐式导入吗?

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:

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

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

    同时使用Future,就像使用任何其他单子构造(如Option)一样——调用mapflatMaponSuccess等等,将你的计算链接到传播的@987654328中@上下文。

    【讨论】:

    • 好点。我的原始应用程序最初并不打算在 Play 上下文中,但由于它将在不久的将来集成到 Play Web 服务中,它应该可以完成工作。谢谢你的回答。
    【解决方案2】:

    拜托,有人告诉我有更好的方法来回答我的问题。我让它工作,但这看起来很糟糕:

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

    【讨论】:

    • 编写一个运行查询并等待结果的通用方法非常简单,这样您就不会到处都需要那种“丑陋”了。
    • 当然。我只是想知道为什么 Slick 3 没有像第 2 版那样做一些隐含的工作。
    • 我完全按照 JimN 的建议做了。效果很好。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2015-08-23
    • 2015-07-24
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多