web-dev-qa-db-fra.com

Comment afficher les requêtes SQL exécutées dans la console Rails?

Lorsque j'exécute des requêtes (par exemple MyModel.where(...) ou record.associated_things) dans la console, comment puis-je voir les requêtes de base de données en cours d'exécution afin de mieux comprendre ce qui se passe?

94
randombits

Rails 3+

Entrez cette ligne dans la console:

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

Rails 2

Entrez cette ligne dans la console:

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

Dans Rails 3+, vous pouvez utiliser ActiveRecord :: Relation's to_sql méthode:

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

Il y a un .explain méthode dans Rails 4.
(.to_sql fonctionne aussi, mais ne montrera pas les inclusions)

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
20
lakesare

Depuis récemment, vous pouvez utiliser ceci:

https://github.com/dejan/Rails_panel

Il se compose d'un module complémentaire de console de développeur pour Chrome et d'un fichier gem qui doit être ajouté au Gemfile de votre application comme ceci:

group :development do
  gem 'meta_request'
end

Puis exécutez à nouveau:

bundle install

Redémarrez votre application, ouvrez-la et lancez la console développeur, et vous devriez la voir comme ceci: enter image description here

1
Aleksandar Pavić

Je préfère configurer le niveau de l'enregistreur dans config/application.rb:

config.after_initialize do
  Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end

En production mon ENV['LOG_LEVEL'] sera défini sur la valeur de Logger::INFO et sur ma machine locale ce sera Logger::DEBUG.

0
Huy Vo