gpt4 book ai didi

scala - 杜比。组合 .update.withGeneratedKeys() 和 .update.run

转载 作者:行者123 更新时间:2023-12-01 21:12:04 28 4
gpt4 key购买 nike

引用 this题。
我想通过某种条件插入一些实体。它可以插入也可以不插入。如果条件为真,则插入实体。我想在各种表中插入一些其他数据。它看起来像这样:

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

问题是这不会编译,因为第一个插入是 fs2.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

这有效,但恕我直言,这并不漂亮。有没有更好的方法来做到这一点?

最佳答案

执行批量插入的一种方法 - 如果您有类似的数据 - 是使用 updateMany - see doc :

import doobie._
type PersonInfo = (String, Option[Short])

def insertMany(ps: List[PersonInfo]): ConnectionIO[Int] = {
val sql = "insert into person (name, age) values (?, ?)"
Update[PersonInfo](sql).updateMany(ps)
}

// Some rows to insert
val data = List[PersonInfo](
("Frank", Some(12)),
("Daddy", None))

此外,如果您删除 .compile.last ,你可以使用这样一个事实,如果你的结果 Stream q.update.withGeneratedKeys[Long]("id")empty ,你“早点退出” for-comprehension .

总而言之,您可以执行以下操作:

import fs2.Stream

val result =
// Now the for-comprehension operates on a Stream instead of an Option
for {
r <- q.update.withGeneratedKeys[Long]("id")
_ <- Stream.eval(insertMany(data)) // insertMany(data) is defined like in the snippet above
} yield r

result.compile.last

关于scala - 杜比。组合 .update.withGeneratedKeys() 和 .update.run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56373492/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com