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

Rails 3 - delete_all doesn't support limit scope whereas MySQL supports it

我有一个 table 有 900 万条记录。我定期将此数据同步到第三方。我保留了一个列,告诉特定行是否已经同步。

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

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

会是个好主意。每秒有数百个插入,我认为这可能会导致以 hurt/block 插入的方式锁定 table(此处需要 MySQL 专家来更正)

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

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

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

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

你可以试试:

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

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

在这里执行 SQL 命令如何?

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

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', [])

它将 return 受影响的行并且还将通过 rails 记录器记录查询。