当我运行查询时(例如MyModel.where(...)或record.associated_things),如何查看正在运行的实际数据库查询,以便更好地了解正在发生的情况?
MyModel.where(...)
record.associated_things
gtlvzcf81#
在控制台中输入以下行:
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
tpgth1q72#
在Rails 3+中,你可以使用ActiveRecord::Relation的to_sql方法:
to_sql
User.where(:id => 3).to_sql #=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = 3"
watbbzwu3#
Rails 4中有一个.explain方法。(.to_sql也可以工作,但不会显示包含)
.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
3j86kqsm4#
我只是想给我们的生产控制台提供与我在开发中使用的相同的行为,其中所有SQL查询都报告给控制台。Rails.logger.level = 0
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:…>
smdnsysy5#
从Rails 6开始,有更方便的方法:只需在控制台中添加ActiveRecord::Base.verbose_query_logs = true,您将看到所有SQL调用以及调用它的位置。更多信息https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
ActiveRecord::Base.verbose_query_logs = true
hjzp0vay6#
从最近开始,你可以使用这个:https://github.com/dejan/rails_panel它包括chrome的开发者控制台面板插件,以及需要添加到应用程序的Gemfile的gem文件,如下所示:
group :development do gem 'meta_request' end
然后再次运行:
bundle install
重新启动您的应用程序,打开它,并启动开发人员控制台,您应该看到如下所示:
whitzsjs7#
有一些配置参数可以控制是否将SQL查询打印到日志中。(This答案基于Rails 6.0。)首先,确认日志记录器已配置,并且其@logdev具有符合您期望的@dev或@filename。
@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:
DEBUG
ActiveRecord::Base.logger.debug!
尝试运行查询以查看问题是否已修复:
> ActiveRecord::Base.connection.exec_query 'SELECT 1' SQL (0.1ms) SELECT 1
如果查询被打印到日志文件(例如log/development.log),而不是控制台,则可能需要执行以下操作:
log/development.log
ActiveRecord::Base.logger.extend( ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)) )
如果你仍然没有得到SQL查询,那么ActiveRecord::LogSubscriber可能没有监听事件(例如:因为一些库停用它)。激活它:
ActiveRecord::LogSubscriber
ActiveRecord::LogSubscriber.attach_to :active_record
axkjgtzd8#
我更喜欢在config/application.rb中设置日志记录器级别:
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。
ENV['LOG_LEVEL']
Logger::INFO
Logger::DEBUG
kg7wmglp9#
对于Rails v”6.1.7.3“,以下组合对我有效:
ActiveRecord::Base.logger = Logger.new(STDOUT) ActiveRecord::LogSubscriber.attach_to :active_record
9条答案
按热度按时间gtlvzcf81#
Rails 3+
在控制台中输入以下行:
Rails 2
在控制台中输入以下行:
tpgth1q72#
在Rails 3+中,你可以使用ActiveRecord::Relation的
to_sql
方法:watbbzwu3#
Rails 4中有一个
.explain
方法。(
.to_sql
也可以工作,但不会显示包含)3j86kqsm4#
我只是想给我们的生产控制台提供与我在开发中使用的相同的行为,其中所有SQL查询都报告给控制台。
Rails.logger.level = 0
smdnsysy5#
从Rails 6开始,有更方便的方法:只需在控制台中添加
ActiveRecord::Base.verbose_query_logs = true
,您将看到所有SQL调用以及调用它的位置。更多信息https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logshjzp0vay6#
从最近开始,你可以使用这个:
https://github.com/dejan/rails_panel
它包括chrome的开发者控制台面板插件,以及需要添加到应用程序的Gemfile的gem文件,如下所示:
然后再次运行:
重新启动您的应用程序,打开它,并启动开发人员控制台,您应该看到如下所示:
whitzsjs7#
有一些配置参数可以控制是否将SQL查询打印到日志中。
(This答案基于Rails 6.0。)
首先,确认日志记录器已配置,并且其
@logdev
具有符合您期望的@dev
或@filename
。接下来,确保记录器级别设置为
DEBUG
:尝试运行查询以查看问题是否已修复:
如果查询被打印到日志文件(例如
log/development.log
),而不是控制台,则可能需要执行以下操作:如果你仍然没有得到SQL查询,那么
ActiveRecord::LogSubscriber
可能没有监听事件(例如:因为一些库停用它)。激活它:axkjgtzd8#
我更喜欢在
config/application.rb
中设置日志记录器级别:在生产环境中,我的
ENV['LOG_LEVEL']
将被设置为Logger::INFO
的值,而在我的本地机器上,它将被设置为Logger::DEBUG
。kg7wmglp9#
对于Rails v”6.1.7.3“,以下组合对我有效: