Коли я запускаю запити (наприклад, 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
Існує .explain
метод у Rails 4.
(також .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. Але мені потрібен був необроблений запит, щоб пояснити та проаналізувати. Я думаю, зараз доведеться робити пояснення.
З недавнього часу ви можете використовувати це:
https://github.com/dejan/rails_panel
Він складається з додатку на панелі консолі розробника для хрому та файлу дорогоцінного каміння, який потрібно додати до Gemfile вашої програми так:
group :development do
gem 'meta_request'
end
Потім запустіть ще раз:
bundle install
Перезавантажте програму, відкрийте її та запустіть консоль розробника, і ви повинні побачити її так:
Починаючи з Rails 6, є більш зручний підхід: просто додайте ActiveRecord::Base.verbose_query_logs = true
в консоль, і ви побачите всі SQL-дзвінки та місця, де вона викликалася. Докладніше https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
Я вважаю за краще встановити рівень реєстратора в 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
.