如何在Slick 3.1.x中運行transactionally
語句,並將結果捕獲到Future中(不使用等待)?在事務中運行並檢索未來的結果
此作品(但使用等待)
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) }
UPDATE
這是從沒有按程序採取的實際代碼沒有工作。它打印「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'。 –