sql - rails : Get SQL generated by delete_all

标签 sql ruby-on-rails ruby activerecord rails-activerecord

我对 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/

相关文章:

php - 将sql结果导出到JSON文件

ruby-on-rails - 通过 ruby​​onrails 中的脚手架设置对表的引用

ruby-on-rails - 奇怪的 Heroku 浮点位精度错误(ruby on rails)

ruby 哈希与对上的方法

ruby-on-rails - HAML 中没有值的 HTML 5 数据属性

asp.net - SqlException(0x80131904): Line 28: Incorrect syntax near '(' .]

MYSQL SELECT WHERE CLAUSE - 排除行

php - MySQL 中使用 IF-ELSE 的条件连接语句

ruby-on-rails - 带有 GET/POST 参数的 Rails redirect_to "www.somewebsite.com"?

ruby-on-rails - Rails - 创建一个打印所有对象的特定属性的辅助方法(改为渲染数组)