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


115

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?


Andrew, si vous avez également besoin d'exécuter des commandes dans broweser, vous pouvez utiliser github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk

Voir aussi cette réponse: stackoverflow.com/a/1576221/446106
mwfearnley

Réponses:


249

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)

Parfait, exactement ce dont j'avais besoin. Avez-vous des recommandations pour trouver de petites astuces comme celles-ci?
randombits


2
Cela fonctionne pour les rails 3+ mais pas 2, voir stackoverflow.com/a/1576221 si vous êtes toujours là :)
rogerdpack

Et pour le désactiver à nouveau: ActiveRecord::Base.logger = nil
Hula_Zell

Je suis venu ici tellement de fois, quand je tape "rails" en chrome, il affiche cette page comme résultat supérieur
23tux

33

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

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

25

Il y a la .explainméthode dans Rails 4.
( .to_sqlfonctionne aussi, mais ne montrera pas inclus)

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

Il m'a fallu tellement de temps pour trouver la .explainvolonté de faire le travail et non .to_sql. Et .explainne fournit toujours pas de requête SQL au format brut que je peux exécuter dans la console pg. Mais j'avais besoin de la requête brute pour expliquer et analyser. Je suppose que cela aura à voir avec expliquer pour l'instant.
abhishek77 le

4

Depuis récemment, vous pouvez utiliser ceci:

https://github.com/dejan/rails_panel

Il se compose d'un module complémentaire de panneau de console de développeur pour Chrome et d'un fichier gem qui doit être ajouté au fichier 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: entrez la description de l'image ici



0

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

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

Lors de la production, mon ENV['LOG_LEVEL']sera réglé sur la valeur de Logger::INFOet sur ma machine locale, ce sera le cas Logger::DEBUG.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.