Як показати SQL-запити, запущені в консолі Rails?


115

Коли я запускаю запити (наприклад, MyModel.where(...)або record.associated_things) в консолі, як я можу побачити запущені фактичні запити бази даних, щоб отримати більше розуміння того, що відбувається?


Андрій, якщо вам також потрібно запустити команди в веб-переглядачі, ви можете скористатися github.com/igorkasyanchuk/rails_db
Ігор

Дивіться також ця відповідь: stackoverflow.com/a/1576221/446106
mwfearnley

Відповіді:


249

Рейки 3+

Введіть цей рядок у консоль:

ActiveRecord::Base.logger = Logger.new(STDOUT)

Рейки 2

Введіть цей рядок у консоль:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)

Ідеально, саме те, що мені було потрібно. Чи є якісь рекомендації, куди звернутися, щоб знайти невеликі хитрощі, такі як ці, задокументовані?
випадкові орбіти


2
Це працює для рейок 3+, але не 2, дивіться stackoverflow.com/a/1576221, якщо ви там ще :)
rogerdpack

І відключити його знову: ActiveRecord::Base.logger = nil
Hula_Zell

Я був тут стільки разів, коли
набираю

33

У Rails 3+ ви можете використовувати to_sqlметод ActiveRecord :: Relation :

User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"id\" = 3"

25

Існує .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. Але мені потрібен був необроблений запит, щоб пояснити та проаналізувати. Я думаю, зараз доведеться робити пояснення.
абхишек77ін

4

З недавнього часу ви можете використовувати це:

https://github.com/dejan/rails_panel

Він складається з додатку на панелі консолі розробника для хрому та файлу дорогоцінного каміння, який потрібно додати до Gemfile вашої програми так:

group :development do
  gem 'meta_request'
end

Потім запустіть ще раз:

bundle install

Перезавантажте програму, відкрийте її та запустіть консоль розробника, і ви повинні побачити її так: введіть тут опис зображення



0

Я вважаю за краще встановити рівень реєстратора в 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.