【发布时间】:2016-12-02 18:38:41
【问题描述】:
如何在 Slick 3.1.x 中运行 transactionally 语句,并在 Future 中捕获结果(不使用 Await)?
这有效(但使用等待)
val action = db.run((for {
_ <- table1.filter(_.id1 === id).delete
_ <- table2.filter(_.id2=== id).delete
} yield ()).transactionally)
val result = Await.result(action, Duration.Inf)
但是这不会打印任何东西:
val future = db.run((for {
_ <- table1.filter(_.id1 === id).delete
_ <- table2.filter(_.id2=== id).delete
} yield ()).transactionally)
future.map { result => println("result:"+result) }
更新
这是从不起作用的程序中提取的真实代码。它打印“1”,但从不打印“2”
case class UserRole (sk: Int, name: String)
class UserRoleDB(tag: Tag) extends Table[UserRole](tag, "user_roles") {
def sk = column[Int]("sk", O.PrimaryKey)
def name = column[String]("name")
def * = (sk, name) <> ((UserRole.apply _).tupled, UserRole.unapply)
}
class Test extends Controller {
def index = Action.async { request =>
val db = Database.forConfig("db1")
val userRoles = TableQuery[UserRoleDB]
val ur = UserRole(1002,"aaa")
try {
val action = (for {
userRole2 <- userRoles += ur
} yield (userRole2)).transactionally
val future = db.run(action)
println(1)
// val result = Await.result(future, Duration.Inf)
future.map { result => {
println(2)
Ok("Finished OK")
}
}
}
finally db.close
}
}
【问题讨论】:
-
你的代码没问题。也许应用程序在未来完成之前退出。尝试在映射未来后添加一些
Thread.sleep以查看它是否有效。 -
对于像
println这样的副作用函数(返回Unit),最好使用foreach(而不是map)。 -
如果
future.map没有生效是因为未来可能会失败,请尝试附加.recover或.recoverWith。