当我在控制台运行查询(例如 MyModel.where(...)
或 record.associated_things
)时,我如何查看实际正在运行的数据库查询,以便更好地了解正在发生的情况?
当我在控制台运行查询(例如 MyModel.where(...)
或 record.associated_things
)时,我如何查看实际正在运行的数据库查询,以便更好地了解正在发生的情况?
在控制台中输入以下代码:
ActiveRecord::Base.logger = Logger.new(STDOUT)
在控制台输入以下代码:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
ActiveRecord::Base.logger = nil
- Hula_Zellto_sql
方法:to_sql
。User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = 3"
在Rails 4中有.explain
方法。
(.to_sql
也可以使用,但不会显示includes)
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
仍然不能提供可在 pg 控制台中运行的原始格式的 SQL 查询。但我需要原始查询来进行解释和分析。我想现在只能用 explain 先凑合着了。 - abhishek77in我只是想让我们的生产控制台表现出与开发环境相同的行为,即将所有的SQL查询报告到控制台。
Rails.logger.level = 0
3.0.3 :001 > Rails.logger.level = 0
=> 0
3.0.3 :002 > User.last
User Load (0.7ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User:…>
Rails.logger.level = :debug
- Rorrim从Rails 6开始,有更方便的方法:在控制台中添加ActiveRecord::Base.verbose_query_logs = true
,您将看到所有SQL调用以及调用它的位置。更多信息请参见https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
AR::Base
中移除(https://github.com/rails/rails/commit/c3f43075a3c70c3b11717741426ec38a8d3cd14a),并且在 Rails 7.0 中作为 ActiveRecord.verbose_query_logs
可用。 - Dave Powers最近,你可以使用这个:
https://github.com/dejan/rails_panel
它由chrome浏览器的开发者控制台面板插件和需要添加到应用程序Gemfile的gem文件组成,像这样:
group :development do
gem 'meta_request'
end
然后再次运行:
bundle install
有几个配置参数可以控制是否将SQL查询打印到日志中。
(本答案基于Rails 6.0。)
首先,请确认记录器已经配置好,并且它的@logdev
具有与您期望匹配的@dev
或@filename
。
pry(main)> ActiveRecord::Base.logger
=> #<ActiveSupport::Logger:0x00007fd47b400900
...,
@logdev=
#<Logger::LogDevice:0x00007fd47b400a90
@binmode=false,
@dev=#<File:log/development.log>,
@filename="log/development.log",
...>,
...>
接下来,请确保日志记录器级别设置为DEBUG
:
ActiveRecord::Base.logger.debug!
尝试运行查询以查看问题是否已解决:
> ActiveRecord::Base.connection.exec_query 'SELECT 1'
SQL (0.1ms) SELECT 1
如果查询被打印到日志文件(例如log/development.log
),但没有在控制台上显示,那么您可能需要执行以下操作:
ActiveRecord::Base.logger.extend(
ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT))
)
ActiveRecord :: LogSubscriber
没有监听事件(例如,某些库将其停用)。请激活它:ActiveRecord::LogSubscriber.attach_to :active_record
对于Rails v“6.1.7.3”,以下组合适用于我:
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::LogSubscriber.attach_to :active_record
我更喜欢在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
。