如何成功地组合平滑的读操作和平滑的写操作以进行理解

时间:2019-05-28 22:34:32

标签: scala slick

考虑一下,我有下表:A,B和AB。 表AB是A和B之间的链接表。

当我执行一个简单的insertOrUpdate操作时,它会成功。我在表中插入了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

但是,当我从表A和B中读取数据时,请获取ID,然后将其用于表述将insertorUpdate插入表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

有人可以阐明这种行为吗?

1 个答案:

答案 0 :(得分:0)

因为映射操作是对for的最后一个值执行的,所以run并未执行insertOrUpdate语句。当我使用flatMap时,它可以工作。

使用地图时。它创建一个嵌套的DBIOAction。 内部sqlAction不执行。
a = ['a', 'b', 'c', 'd', 'e'] b = int(input("Number of digit:\n")) #This is for 1 digit printed if b == 1: for i in a: print(i) #This is for 2 digit printed elif b == 2: for i in a: for j in a: print(i,j) #This is for 3 digit printed elif b == 2: for i in a: for j in a: for k in a: print(i,j,k)

使用flatMap时,它会创建一个展平的DBIOAction并执行。
DBIOAction[FixedSqlAction[Int, NoStream, Effect.Write], NoStream, Effect.Read with Effect.Read]

DBIOAction[Int, NoStream, Effect.Read with Effect.Read with Effect.Write]