如何通过光滑

时间:2016-12-28 12:46:57

标签: scala datasource 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”读取数据 我已多次尝试谷歌解决方案,但没有答案可以解决我的困惑 非常感谢

2 个答案:

答案 0 :(得分:2)

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 (r <- f) yield db.run(q(r))

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

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

答案 1 :(得分:2)

query.result的类型为DBIO。当您致电db.run时,会变成Future

如果要打印数据,请使用

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

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

如果您想阻止未来并获得结果(例如,如果您在REPL中玩游戏),请使用类似

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

请记住,这不是您想要在生产代码中执行的操作 - 阻止期货是一种不好的做法。

我通常建议您特别了解Scala核心类型和期货。光滑&#34;责任&#34;当你致电db.run时结束。