【发布时间】:2014-04-23 18:48:48
【问题描述】:
我需要批量更新数千条记录,我想批量处理更新。首先,我试过了:
Foo.where(bar: 'bar').find_in_batches.update_all(bar: 'baz')
...我希望它会生成如下 SQL:
"UPDATE foo SET bar = 'baz' where bar='bar' AND id > (whatever id is passed in by find_in_batches)"
这不起作用,因为 find_in_batches 返回一个数组,而 update_all 需要一个 ActiveRecord 关系。
这是我接下来尝试的:
Foo.where(bar: 'bar').select('id').find_in_batches do |foos|
ids = foos.map(&:id)
Foo.where(id: ids).update_all(bar: 'baz')
end
这行得通,但它显然会运行一个选择,然后是更新,而不是基于我的“位置”条件的单个更新。有什么办法可以清理这个问题,这样 select 和 update 就不必是单独的查询了?
【问题讨论】:
-
但是您必须分批进行更新吗?你的 where 子句产生了多少行?
-
where 子句将检索数十万条记录,这就是我使用 find_in_batches 一次处理 1000 条更新的原因。
-
和玛丽安一样的问题,我不明白你的推理。如果您执行 Foo.where().update_all 它不会将记录加载到 Rails,只需执行数据库更新查询。
-
@MichaelSzyndel,我正在分批执行更新,以避免在更新数十万条记录时锁定我的表。
标签: sql ruby-on-rails