2

寻找一种使用 slick 进行批量更新的方法。是否有与 insertALL 等效的 updateAll?到目前为止,古尔的研究让我失望了。

我有一个具有不同状态的案例类列表。每个都有不同的数值,所以我无法运行典型的更新查询。同时,我想保存多个更新请求,因为我想同时更新数千条记录。

4

2 回答 2

2

很抱歉回答我自己的问题,但我最终做的只是下降到 JDBC 并进行批处理更新。

  private def batchUpdateQuery = "update table set value = ? where id = ?"

  /**
   * Dropping to jdbc b/c slick doesnt support this batched update
   */
  def batchUpate(batch:List[MyCaseClass])(implicit subject:Subject, session:Session) = {
    val pstmt = session.conn.prepareStatement(batchUpdateQuery)

    batch map { myCaseClass =>
      pstmt.setString(1, myCaseClass.value)
      pstmt.setString(2, myCaseClass.id)
      pstmt.addBatch()
    }

    session.withTransaction {
      pstmt.executeBatch()
    }
  }
于 2014-09-04T21:22:14.383 回答
1

我不清楚您要实现什么,插入和更新是两个不同的操作,因为插入具有批量功能是有意义的,对于更新我认为它没有,实际上在 SQL 中您可以编写类似的东西这个

UPDATE
  SomeTable
SET SomeColumn = SomeValue
WHERE AnotherColumn = AnotherValue

这意味着使用所有等于的行SomeColumn的值进行更新。SomeValueAnotherColumnAnotherValue

Slick是一个简单的filter结合mapupdate

table
  .filter(_.someCulomn === someValue)
  .map(_.FieldToUpdate)
  .update(NewValue)

相反,如果您想更新整行,只需删除并将对象map传递给函数。Rowupdate

编辑:

如果您想更新不同的案例类,我会认为这些案例类是您的架构中定义的行,如果是这种情况,您可以将它们直接传递给更新函数,因为它是这样定义的:

def update(value: T)(implicit session: Backend#Session): Int

对于第二个问题,我无法为您提供解决方案,查看JdbcInvokerComponent特征看起来更新函数立即调用执行方法

def update(value: T)(implicit session: Backend#Session): Int = session.withPreparedStatement(updateStatement) { st =>
  st.clearParameters
  val pp = new PositionedParameters(st)
  converter.set(value, pp, true)
  sres.setter(pp, param)
  st.executeUpdate
}

可能是因为您实际上可以在每个表的时间运行一个更新查询,而不是对多个表进行多次更新,如此SO question中所述,但您当然可以更新同一张表上的多行。

于 2014-07-22T18:15:38.627 回答