寻找一种使用 slick 进行批量更新的方法。是否有与 insertALL 等效的 updateAll?到目前为止,古尔的研究让我失望了。
我有一个具有不同状态的案例类列表。每个都有不同的数值,所以我无法运行典型的更新查询。同时,我想保存多个更新请求,因为我想同时更新数千条记录。
很抱歉回答我自己的问题,但我最终做的只是下降到 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()
}
}
我不清楚您要实现什么,插入和更新是两个不同的操作,因为插入具有批量功能是有意义的,对于更新我认为它没有,实际上在 SQL 中您可以编写类似的东西这个
UPDATE
SomeTable
SET SomeColumn = SomeValue
WHERE AnotherColumn = AnotherValue
这意味着使用所有等于的行SomeColumn
的值进行更新。SomeValue
AnotherColumn
AnotherValue
这Slick
是一个简单的filter
结合map
和update
table
.filter(_.someCulomn === someValue)
.map(_.FieldToUpdate)
.update(NewValue)
相反,如果您想更新整行,只需删除并将对象map
传递给函数。Row
update
编辑:
如果您想更新不同的案例类,我会认为这些案例类是您的架构中定义的行,如果是这种情况,您可以将它们直接传递给更新函数,因为它是这样定义的:
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中所述,但您当然可以更新同一张表上的多行。