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?
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?
Réponses:
Entrez cette ligne dans la console:
ActiveRecord::Base.logger = Logger.new(STDOUT)
Entrez cette ligne dans la console:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
ActiveRecord::Base.logger = nil
Il y a la .explain
méthode dans Rails 4.
( .to_sql
fonctionne 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
.explain
volonté de faire le travail et non .to_sql
. Et .explain
ne 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.
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:
À partir de Rails 6, il existe une approche plus pratique: ajoutez simplement la ActiveRecord::Base.verbose_query_logs = true
console et vous verrez tous les appels SQL et les endroits où il a été appelé. Plus d'infos https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
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::INFO
et sur ma machine locale, ce sera le cas Logger::DEBUG
.