首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新ScalikeJDBC中的返回查询

更新ScalikeJDBC中的返回查询
EN

Stack Overflow用户
提问于 2019-03-18 00:02:35
回答 1查看 823关注 0票数 0

具有implicit val session: DBSession的作用域,具体为scalikejdbc.AutoSession

更新工作

代码语言:javascript
复制
sql"""
    update payments set status=${status.name} where id in ($ids)
""".update().apply()

并选择工作

代码语言:javascript
复制
sql"""
   select id
   from payments
   where status='valid'
""".map(_.long).list().apply()

但是更新返回列失败,因为事务被设置为只读。

代码语言:javascript
复制
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

sessionSQLToResult内部匹配,并假设它应该是只读的:

代码语言:javascript
复制
  case AutoSession | ReadOnlyAutoSession => DB.readOnly(f)

为了避免匹配这种模式,我尝试创建了自己的DBSession,但放弃了这种方法。我最想让它发挥作用的是:

代码语言:javascript
复制
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.connectionnull

我怎么能强迫这个人成为localTx而不是readOnly呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-18 01:24:12

通常,AutoSession作为DDL和insert/update/delete ops的自动提交会话,而作为select查询的只读会话工作。

它似乎是这样做的,以下是直截了当的方式。

代码语言:javascript
复制
DB.localTx { implicit session =>
  // Have both the update operation and select query inside this block
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55213167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档