Rails 3 - delete_all不支持限制范围,而MySQL支持限制范围

时间:2015-12-31 09:32:54

标签: mysql ruby-on-rails ruby-on-rails-3

我有一张包含9百万条记录的表格。我定期将此数据同步到第三方。我保留一个列,告诉某个特定行是否已经同步。

现在我需要删除几乎6 million个已同步的行,我不确定是否正在运行

Model.where(:sync_flag => true).delete_all

会是一个好主意。每秒有数百个插入,我认为它可能导致以一种会伤害/阻止插入的方式锁定表(MySQL专家需要在此处更正)

通过上面的序言,我想到在循环中使用带限制子句的删除删除所有记录,直到没有留下但是使用以下

Model.where(:sync_flag => true).limit(5000).delete_all

它引发了异常delete_all doesn't support limit scope

是否有解决方法可以在不离开Rails环境的情况下解决问题?

3 个答案:

答案 0 :(得分:2)

ActiveRecord::Base.connection.send(:delete_sql,'delete from <table name> where sync_flag = true limit 1000')

你必须使用send,因为'delete_sql'受到保护,但这有效。

另一种解决方案可能是

Model.connection.exec_delete('DELETE FROM <table name> where sync_flag=true LIMIT 10000', 'DELETE', [])

它将返回受影响的行,并且还将通过rails logger记录查询。

答案 1 :(得分:1)

您可以尝试:

Model.where(:sync_flag => true).limit(5000).destroy_all

您可以在以下位置找到更多详情: http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-delete_all

答案 2 :(得分:1)

在这里执行SQL命令怎么样?

Model.connection.exec_delete('DELETE FROM models WHERE sync_flag = 1 LIMIT 5000', 'DELETE', [])