考虑一下,我有下表: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
有人可以阐明这种行为吗?
答案 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]