数据库
首页 > 数据库> > Rails 3-delete_all不支持限制范围,而MySQL支持

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