如何从光滑的查询结果中获取值

How to get values from query result in slick

我尝试使用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" 中读取数据 google这个方案我已经试了很多次了,还是没有答案能解决我的困惑 非常感谢

f 是一个 Future 并且您可以做几件事来获得价值,具体取决于您需要的紧迫程度它。如果在等待期间您无事可做,那么您将不得不等待它完成,然后获取价值。也许最简单的是遵循以下几行(来自 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 comprehension。类似于以下内容:

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

其中 q 是一个 function/method ,它将获取您的第一个查询的结果并构建另一个查询。当然,这个 for comprehension 的结果也会是 Future

需要注意的一件事是,如果您 运行 在一个程序中执行此操作,该程序将在所有代码完成 运行 后退出,您将需要使用 Await (请参阅 Scala API) 以防止程序在您的数据库查询之一仍在运行时退出。

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。 Slick "responsibility" 在您调用 db.run 时结束。