Как успешно объединить скользкое действие чтения и затем плавное действие записи для понимания - PullRequest
1 голос
/ 29 мая 2019

Считайте, что у меня есть следующие таблицы: 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, получаю идентификаторы, а затем вставляю в таблицу 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 голосов
/ 29 мая 2019

Поскольку операция сопоставления выполняется с последним значением для понимания, оператор insertOrUpdate не был выполнен run. Когда я использую flatMap, он работает.

При использовании карты. он создает вложенный DBIOAction. Внутренний sqlAction не выполняется.
DBIOAction[FixedSqlAction[Int, NoStream, Effect.Write], NoStream, Effect.Read with Effect.Read]

При использовании flatMap создается действие 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

...