【问题标题】:How to get values from query result in slick如何从查询结果中获取值
【发布时间】:2016-12-28 12:46:57
【问题描述】:

我尝试使用 Slick(3.0.2) 在我的项目中使用 scala 操作数据库。 这是我的部分代码

val query = table.filter(_.username === "LeoAshin").map { user => (user.username, user.password, user.role, user.delFlg) }

val f = db.run(query.result)

如何从“f”读取数据 我已经多次尝试谷歌解决方案,但没有答案可以解决我的困惑 非常感谢

【问题讨论】:

    标签: scala datasource slick


    【解决方案1】:

    f 是一个未来,你可以做几件事来获得价值,这取决于你需要它的紧迫程度。如果在等待时您无能为力,那么您只需等待它完成然后获取价值。也许最简单的方法是遵循以下几行(来自Slick documentation):

    val q = for (c <- coffees) yield c.name
    val a = q.result
    val f: Future[Seq[String]] = db.run(a)
    f.onSuccess { case s => println(s"Result: $s") }
    

    然后你可以继续做不依赖于 f 结果的其他事情,查询的结果将异步打印在控制台上。

    但是,大多数情况下,您会希望将该值用于其他一些操作,也许是另一个数据库查询。在这种情况下,最简单的做法是使用用于理解。类似于以下内容:

    for (r <- f) yield db.run(q(r))
    

    其中 q 是一个函数/方法,它将获取您的第一个查询的结果并构建另一个查询。当然,这种理解的结果也将是一个未来

    需要注意的一点是,如果您在运行所有代码后将退出的程序中运行此程序,则需要使用 Await(请参阅 Scala API)来防止程序在您的一个数据库查询仍在工作。

    【讨论】:

      【解决方案2】:

      query.result 的类型是 DBIO。当你调用db.run时,它会变成Future

      如果要打印数据,请使用

      import scala.concurrent.ExecutionContext.Implicits.global
      f.foreach(println)
      

      要继续处理数据,请使用f.map { case (username, password, role, delFlg) ⇒ ... }

      如果您想阻止 Future 并获得结果(例如,如果您在 REPL 中玩耍),请使用类似

      import scala.concurrent.Await
      import scala.concurrent.duration._
      Await.result(f, 1.second)
      

      请记住,这不是您希望在生产代码中执行的操作 - 阻塞 Futures 是一种不好的做法。

      我通常建议专门学习 Scala 核心类型和 Futures。当你打电话给db.run时,巧妙的“责任”就结束了。

      【讨论】:

      • 对不起,我还想问你一些问题
      • 对不起,我还是不太清楚,我按照你的方式试过 f.map { case (username, password, role, delFlg) ⇒ ... } 但是编译出错,你能给我更多示例代码?例如我想判断 delFlg == 1 然后做下一步
      • 用您的情况替换...
      猜你喜欢
      • 2018-12-06
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多