Rails 3-delete_all不支持限制范围,而MySQL支持
作者:互联网
我有一张桌子,上面有900万条记录.我定期将这些数据同步到第三方.我保持一列,告诉特定的行是否已经同步.
现在,我需要删除将近600万个同步行,并且不确定是否正在运行
Model.where(:sync_flag => true).delete_all
会是个好主意.每秒有数百次插入,我认为这可能会导致锁定/锁定表的方式导致表被锁定/阻塞(MySQL专家需要在此处进行更正)
有了上面的序言,我想到了在循环中使用带limit子句的delete来删除所有记录,直到没有记录为止,并带有以下内容
Model.where(:sync_flag => true).limit(5000).delete_all
它引发了一个异常delete_all不支持限制范围.
是否有一种解决方法可以在不离开Rails环境的情况下解决此问题?
解决方法:
ActiveRecord :: Base.connection.send(:delete_sql,’从<表名>中删除,其中sync_flag = true limit 1000′)
您必须使用send,因为’delete_sql’受保护,但这是可行的.
另一个解决方案可能是
Model.connection.exec_delete(‘从<表名>删除,其中sync_flag = true LIMIT 10000′,’DELETE’,[])
它将返回受影响的行,并且还将通过rails logger记录查询.
标签:ruby-on-rails-3,ruby-on-rails,mysql 来源: https://codeday.me/bug/20191027/1945146.html