我对 Ruby on Rails 不是特别熟悉,但我正在解决我们在清理数据库表的 rake 作业中遇到的问题。表增长得非常快,而且 ActiveRecord 生成的查询似乎不足以有效地处理它。
Ruby 调用如下所示:
Source.where("id not IN (#{Log.select('DISTINCT source_id').to_sql})").delete_all
还有这个:
Log.joins(:report).where(:report_id => Report.where(cond)).delete_all
我正在尝试了解 SQL,这样我们就可以让 DBA 尝试更好地优化它。我注意到,如果我删除“.delete_all”,我可以添加一个“.to_sql”,它在调用“.delete_all”之前为我提供查询的 SELECT 语句。不过,我想看看该 delete_all 方法正在生成什么 SQL。
有办法做到这一点吗?
最佳答案
另一个选择是使用原始 Arel 语法,类似于 ActiveRecord::Relation#delete_all 的简化版本确实如此。
relation = Model.where(...)
arel = relation.arel
stmt = Arel::DeleteManager.new
stmt.from(arel.join_sources.empty? ? Model.arel_table : arel.source)
stmt.wheres = arel.constraints
sql = Model.connection.to_sql(stmt, relation.bound_attributes)
print sql
这将为您提供生成的删除 sql。以下是使用 postgres 作为 sql 适配器的示例
relation = User.where('email ilike ?', '%@gmail.com')
arel = relation.arel
stmt = Arel::DeleteManager.new
stmt.from(arel.join_sources.empty? ? User.arel_table : arel.source)
stmt.wheres = arel.constraints
sql = User.connection.to_sql(stmt, relation.bound_attributes)
=> DELETE FROM "users" WHERE (email ilike '%@gmail.com')
关于sql - rails : Get SQL generated by delete_all,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640321/