如何从光滑的查询结果中获取值
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
时结束。
我尝试使用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
时结束。