У меня есть необязательный запрос на вставку:
val q = sql"insert into some_table (some_field) select 42 where ...(some condition)"
Выполнение этого запроса с помощью:
q.update.withUniqueGeneratedKeys[Option[Long]]("id")
терпит неудачу с
Result set exhausted: more rows expected
тогда condition
ложно.
Как получить Optional[Long]
результат от операторов вставки с помощью Doobie?
УПД
.withGeneratedKeys[Long]("id")
дает только Long
для понимания
val q = sql"insert into some_table (some_field) select 42 where ...(some condition)"
for {
id <- q.update.withGeneratedKeys[Long]("id") // id is long
_ <- if (<id is present>) <some other inserts> else <nothing>
} yield id
Как проверить id
?
Как прокомментировал @Thilo, вы можете использовать использование withGeneratedKeys
, которое возвращает вам Stream[F, Long]
(где F
— ваш тип эффекта)
val result = q.update.withGeneratedKeys[Long]("id")
Вот документ.
.withGeneratedKeys[Long]("id")
дает только Long
для понимания. Смотрите УПД. Как справиться с этой проблемой?
Это for-comprehension
на Stream
, так что это действительно Long
, если Stream
окажется пустым, ничего не будет сделано, поэтому вы можете безопасно удалить оператор if
В документации сказано, что
withUniqueGeneratedKeys
ожидает ровно одну строку. Может быть,withGeneratedKeys
(который возвращает поток всех из них) здесь работает лучше?