如何成功地将 slick read 操作和 slick write 操作结合起来以供理解
How to successfully combine slick read action and then slick write action in for comprehension
假设我有以下 table:A、B 和 AB。
表AB是A和B之间的linktable
当我执行一个简单的 insertOrUpdate 操作时,它成功了。我在 table.
中插入了 1 行
val a = TableQuery[A]
val b = TableQuery[B]
val ab = TableQuery[AB]
Await.result(db.run(ab.insertOrUpdate(ABLink(1,1)),Duration.Inf)
println(Await.result(db.run(ab.length.result, Duration.Inf)))
//prints 1
但是当我从 table A 和 B 读取时,获取 ID,然后将 insertorUpdate 更新到 table AB 中用于理解,该行未插入。程序完成,没有任何错误。
val a = TableQuery[A]
val b = TableQuery[B]
val ab = TableQuery[AB]
val action = for {
aId <- a.map(_.id).result.headOption
bId <- b.map(_.id).result.headOption
}
yield ab.insertOrUpdate(ABLink(aId.get,bId.get))
Await.result(db.run(action),Duration.Inf)
println(Await.result(db.run(ab.length.result, Duration.Inf)))
//prints 0
有人可以阐明这种行为吗?
因为 map 操作是对 for comprehension 的最后一个值执行的,所以 运行 没有执行 insertOrUpdate 语句。当我使用 flatMap 时,它起作用了。
使用地图时。它创建了一个嵌套的 DBIOAction。
内部sqlAction没有执行。
DBIOAction[FixedSqlAction[Int, NoStream, Effect.Write], NoStream, Effect.Read with Effect.Read]
当使用 flatMap 时,它会创建一个被执行的 flattend DBIOAction。
DBIOAction[Int, NoStream, Effect.Read with Effect.Read with Effect.Write]
val a = TableQuery[A]
val b = TableQuery[B]
val ab = TableQuery[AB]
val action = for {
aId <- a.map(_.id).result.headOption
bId <- b.map(_.id).result.headOption
}
yield ABLink(aId.get,bId.get)
Await.result(db.run(action.flatMap(ab.insertOrUpdate(_)),Duration.Inf)
println(Await.result(db.run(ab.length.result, Duration.Inf)))
//prints 1
假设我有以下 table:A、B 和 AB。 表AB是A和B之间的linktable
当我执行一个简单的 insertOrUpdate 操作时,它成功了。我在 table.
中插入了 1 行val a = TableQuery[A]
val b = TableQuery[B]
val ab = TableQuery[AB]
Await.result(db.run(ab.insertOrUpdate(ABLink(1,1)),Duration.Inf)
println(Await.result(db.run(ab.length.result, Duration.Inf)))
//prints 1
但是当我从 table A 和 B 读取时,获取 ID,然后将 insertorUpdate 更新到 table AB 中用于理解,该行未插入。程序完成,没有任何错误。
val a = TableQuery[A]
val b = TableQuery[B]
val ab = TableQuery[AB]
val action = for {
aId <- a.map(_.id).result.headOption
bId <- b.map(_.id).result.headOption
}
yield ab.insertOrUpdate(ABLink(aId.get,bId.get))
Await.result(db.run(action),Duration.Inf)
println(Await.result(db.run(ab.length.result, Duration.Inf)))
//prints 0
有人可以阐明这种行为吗?
因为 map 操作是对 for comprehension 的最后一个值执行的,所以 运行 没有执行 insertOrUpdate 语句。当我使用 flatMap 时,它起作用了。
使用地图时。它创建了一个嵌套的 DBIOAction。
内部sqlAction没有执行。
DBIOAction[FixedSqlAction[Int, NoStream, Effect.Write], NoStream, Effect.Read with Effect.Read]
当使用 flatMap 时,它会创建一个被执行的 flattend DBIOAction。
DBIOAction[Int, NoStream, Effect.Read with Effect.Read with Effect.Write]
val a = TableQuery[A]
val b = TableQuery[B]
val ab = TableQuery[AB]
val action = for {
aId <- a.map(_.id).result.headOption
bId <- b.map(_.id).result.headOption
}
yield ABLink(aId.get,bId.get)
Await.result(db.run(action.flatMap(ab.insertOrUpdate(_)),Duration.Inf)
println(Await.result(db.run(ab.length.result, Duration.Inf)))
//prints 1