152 votes

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

Lorsque j'exécute des requêtes (par exemple MyModel.where(...) 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 ?

316voto

John Topley Points 58789

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)

43voto

Abhi Points 197

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

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

37voto

lakesare Points 6279

Il y a la méthode .explain dans Rails 4.
(.to_sql fonctionne aussi, mais ne s'affiche pas inclut)

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

11voto

Noach Magedman Points 606

Je voulais juste donner à notre console de production le même comportement auquel je suis habitué sur dev, où toutes les requêtes SQL sont rapportées à la console.

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:…>

9voto

kaleb4eg Points 981

À partir de Rails 6, il y a une approche plus pratique : ajoutez simplement ActiveRecord::Base.verbose_query_logs = true dans la console et vous verrez tous les appels SQL et les endroits où il a été appelé. En savoir plus https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X