代码之家  ›  专栏  ›  技术社区  ›  Synesso

更新scalikejdbc中返回的查询

  •  0
  • Synesso  · 技术社区  · 5 年前

    用一个 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?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Kazuhiro Sera    5 年前

    一般来说, AutoSession 作为DDL和插入/更新/删除操作的自动提交会话,而作为选择查询的只读会话。

    它似乎是这样做的,这是一条直线前进的道路。

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