参考这个问题。
我想通过某种条件插入一些实体。它可以插入也可以不插入。如果条件为真,则插入实体。我想在各种表中插入一些其他数据。它看起来像这样:
val q = sql"insert into some_table (some_field) select 42 where ...(some condition)"
val inserts = List(
sql"insert ...",
sql"insert ...",
sql"insert ..."
)
for {
id <- q.update.withGeneratedKeys[Long]("id")
_ <- inserts.reduce(_ ++ _).update.run
} yield id
问题是这不能编译,因为第一个插入是 afs2.Stream
而第二个不是。
我试图_ <- inserts.reduce...
用_ = inserts.reduce
. 该应用程序可以编译,但inserts
在第二行不会发生。
UPD
我解决这个问题的可能方法:
...
for {
idOpt <- q.update.withGeneratedKeys[Long]("id").compile.last
_ <- idOpt.fold(0.pure[ConnectionIO])(_ => inserts.reduce(_ ++ _).update.run)
} yield idOpt
这行得通,但恕我直言,这并不漂亮。有更好的方法吗?