如何在 scala-activerecord 中批量更新
How to mass update in scala-activerecord
我想用单个 SQL 查询更新数据库中的多条记录。有个方法forceUpdate
,可以这样用:
case class Document(size: Int, var status: String) extends ActiveRecord
object Document extends ActiveRecordCompanion[Document]
Document.forceUpdate(_.size < 100)(_.status := "small")
但是,它像 beforeSave()
一样绕过了验证和挂钩。我尝试了底层 squeryl:
Document.inTransaction {
update(Document.table)(d =>
where(d.size < 100)
set(d.status := "small")
)
}
但它也忽略了钩子。
我似乎找不到同时更新多个文档的方法,同时使用挂钩和验证。至少有一些解决方法吗?
当您进行部分更新时,您正在更新一些未知数量的符合您的条件的记录而不检索它们。但是,要触发挂钩,需要知道(即检索)更新的对象。我能想到的最佳替代方法是检索您正在更新的所有对象,然后使用 batch update 而不是部分更新。这不会像您正在执行的部分更新那样快速或高效,但除非您可以在数据库中注册您的挂钩,否则我不知道替代方案是什么。
我想用单个 SQL 查询更新数据库中的多条记录。有个方法forceUpdate
,可以这样用:
case class Document(size: Int, var status: String) extends ActiveRecord
object Document extends ActiveRecordCompanion[Document]
Document.forceUpdate(_.size < 100)(_.status := "small")
但是,它像 beforeSave()
一样绕过了验证和挂钩。我尝试了底层 squeryl:
Document.inTransaction {
update(Document.table)(d =>
where(d.size < 100)
set(d.status := "small")
)
}
但它也忽略了钩子。
我似乎找不到同时更新多个文档的方法,同时使用挂钩和验证。至少有一些解决方法吗?
当您进行部分更新时,您正在更新一些未知数量的符合您的条件的记录而不检索它们。但是,要触发挂钩,需要知道(即检索)更新的对象。我能想到的最佳替代方法是检索您正在更新的所有对象,然后使用 batch update 而不是部分更新。这不会像您正在执行的部分更新那样快速或高效,但除非您可以在数据库中注册您的挂钩,否则我不知道替代方案是什么。