Как показать выполнение SQL-запросов в консоли Rails?


115

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


Андрей, если вам нужно также запускать команды в broweser, вы можете использовать github.com/igorkasyanchuk/rails_db
Игорь Касьянчук

См. Также этот ответ: stackoverflow.com/a/1576221/446106
mwfearnley 05

Ответы:


250

Рельсы 3+

Введите эту строку в консоль:

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

Рельсы 2

Введите эту строку в консоль:

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

Отлично, именно то, что мне нужно. Есть какие-нибудь рекомендации, где найти небольшие трюки, подобные тем, что задокументированы?
Randombits


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

В .explainRails 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. Но мне нужен был необработанный запрос, чтобы объяснить и проанализировать. Думаю, пока придется заняться объяснением.
abhishek77,

4

С недавнего времени вы можете использовать это:

https://github.com/dejan/rails_panel

Он состоит из надстройки панели консоли разработчика для Chrome и файла gem, который необходимо добавить в 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

В процессе производства my ENV['LOG_LEVEL']будет установлено значение, Logger::INFOа на моем локальном компьютере будет Logger::DEBUG.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.