如何显示在 Rails 控制台中运行的 SQL 查询?
Posted
技术标签:
【中文标题】如何显示在 Rails 控制台中运行的 SQL 查询?【英文标题】:How to show SQL queries run in the Rails console? 【发布时间】:2011-02-25 12:46:48 【问题描述】:当我在控制台中运行查询(例如 MyModel.where(...)
或 record.associated_things
)时,我如何才能看到正在运行的实际数据库查询,以便更好地了解正在发生的事情?
【问题讨论】:
安德鲁,如果您还需要在浏览器中运行命令,您可以使用github.com/igorkasyanchuk/rails_db 另请参阅此答案:***.com/a/1576221/446106 【参考方案1】:Rails 3+
在控制台输入这一行:
ActiveRecord::Base.logger = Logger.new(STDOUT)
导轨 2
在控制台输入这一行:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
【讨论】:
完美,正是我需要的。有什么建议可以去哪里找到这些记录在案的小技巧? 当然。 slash7.com/2006/12/21/secrets-of-the-rails-console-ninjas 和 ***.com/questions/123494/… 加上 railscasts.com 总是好的。 这适用于 rails 3+ 但不适用于 2,如果您还在那里,请参阅 ***.com/a/1576221 :) 并再次禁用它:ActiveRecord::Base.logger = nil
我来过很多次了,当我在chrome中输入“rails”时,它会将此页面显示为顶部结果【参考方案2】:
在 Rails 3+ 中,您可以使用 ActiveRecord::Relation 的 to_sql
方法:
User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = 3"
【讨论】:
【参考方案3】:Rails 4 中有 .explain
方法。
(.to_sql
也可以,但不会显示包含)
Category.includes(:products).explain
=> EXPLAIN for: SELECT "categories".* FROM "categories" 0|0|0|SCAN TABLE categories
EXPLAIN for: SELECT "categories_products".* FROM "categories_products" WHERE "categories_products"."category_id" IN (1, 2) 0|0|0|SCAN TABLE categories_products
EXPLAIN for: SELECT "products".* FROM "products" WHERE "products"."id" IN (1, 2, 3, 4, 5, 6, 7) 0|0|0|SEARCH TABLE products USING INTEGER PRIMARY KEY (rowid=?) 0|0|0|EXECUTE LIST SUBQUERY 1
【讨论】:
我花了很多时间才找到.explain
可以完成这项工作,而不是 .to_sql
。而.explain
仍然不提供原始格式的 sql 查询,我可以在 pg 控制台中运行。但我需要原始查询来解释和分析。我想现在与解释有关。【参考方案4】:
从 Rails 6 开始,有更方便的方法:只需在控制台中添加 ActiveRecord::Base.verbose_query_logs = true
,您将看到所有 SQL 调用和调用它的位置。更多信息https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
【讨论】:
应该没有必要再打开它了,因为它现在应该默认开启:“Rails 5.2 之后的开发环境日志中默认启用详细查询日志。”【参考方案5】:从最近开始,你可以使用这个:
https://github.com/dejan/rails_panel
它由 chrome 的开发者控制台面板插件和需要添加到应用程序的 Gemfile 的 gem 文件组成,如下所示:
group :development do
gem 'meta_request'
end
然后再次运行:
bundle install
重新启动您的应用程序,打开它,然后启动开发者控制台,您应该会看到如下所示:
【讨论】:
【参考方案6】:我只是想为我们的生产控制台提供我在 dev 上习惯的相同行为,所有 SQL 查询都报告给控制台。
Rails.logger.level = 0
【讨论】:
【参考方案7】:我更喜欢在config/application.rb
中设置记录器级别:
config.after_initialize do
Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end
在生产中,我的ENV['LOG_LEVEL']
将设置为Logger::INFO
的值,而在我的本地计算机上,它将设置为Logger::DEBUG
。
【讨论】:
以上是关于如何显示在 Rails 控制台中运行的 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 控制台中运行 ActiveJob 进行调试?
如何在 Rails 中链接原始 SQL 查询或如何从 Rails 中的原始 SQL 查询返回 ActiveRecord_Relation?