Обновление возвращаемых запросов в ScalikeJDBC - PullRequest
0 голосов
/ 18 марта 2019

С областью действия implicit val session: DBSession, конкретно как scalikejdbc.AutoSession:

Обновления работают

sql"""
    update payments set status=${status.name} where id in ($ids)
""".update().apply()

И выбирает работу

sql"""
   select id
   from payments
   where status='valid'
""".map(_.long).list().apply()

Но обновлениевозврат столбцов завершается неудачно, потому что транзакция установлена ​​только для чтения.

sql"""
  update payments
  set status='submitted'
  where status='pending'
  and scheduled <= ${ZonedDateTime.now.toInstant}
  returning id
""".map(_.long).iterable().apply().toIterator

org.postgresql.util.PSQLException: ERROR: cannot execute UPDATE in a read-only transaction.

session соответствует SQLToResult в предположении, что она должна быть только для чтения:

  case AutoSession | ReadOnlyAutoSession => DB.readOnly(f)

Я пытался создать свой собственный DBSession, чтобы избежать совпадения с этим шаблоном, но отказался от этого подхода.Самое близкое, что я получил к работе, было:

val writeableSession: DBSession = DBSession(session.connection, isReadOnly = false)

def inner()(implicit session: DBSession): Iterator[Payment] = {
  sql"""
  update payments
  set status='submitted'
  where status='pending'
  returning id
""".map(_.long).iterable().apply().toIterator
}

inner()(writeableSession)

Это не удалось, потому что session.connection было null.

Как я могу заставить это быть localTx вместо readOnly?

1 Ответ

1 голос
/ 18 марта 2019

Как правило, AutoSession ведет себя как сеанс автоматической фиксации для DDL и операций вставки / обновления / удаления, тогда как он работает как сеанс только для чтения для запросов на выборку.

Кажется, что это прямой путь.

DB.localTx { implicit session =>
  // Have both the update operation and select query inside this block
}
...