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 记录器记录查询。
我有一个 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 记录器记录查询。