この質問を参照してください。
何らかの条件でエンティティを挿入したい。挿入してもしなくても構いません。条件が true の場合、エンティティが挿入されます。さまざまなテーブルに他のデータを挿入したい。次のようになります。
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
問題は、最初の挿入は a ですが、2 番目の挿入はそうでないため、これがコンパイルされfs2.Stream
ないことです。
に置き換えようとして_ <- inserts.reduce...
いました_ = inserts.reduce
。アプリはコンパイルできますがinserts
、2 行目では発生しません。
UPD
この問題を解決する私の可能な方法:
...
for {
idOpt <- q.update.withGeneratedKeys[Long]("id").compile.last
_ <- idOpt.fold(0.pure[ConnectionIO])(_ => inserts.reduce(_ ++ _).update.run)
} yield idOpt
これは機能しますが、IMHO これはきれいではありません。それを行うより良い方法はありますか?