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?

randombits
la source
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)
John Topley
la source
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"
Abhi
la source
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
Lakesare
la source
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

Aleksandar Pavić
la source
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.

Huy Vo
la source