4

この質問を参照してください。
何らかの条件でエンティティを挿入したい。挿入してもしなくても構いません。条件が 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 これはきれいではありません。それを行うより良い方法はありますか?

4

1 に答える 1