Wie kann ich beim Ausführen von Abfragen (z. B. MyModel.where(...)
oder record.associated_things
) in der Konsole die tatsächlich ausgeführten Datenbankabfragen anzeigen, um besser zu verstehen, was passiert?
Wie kann ich beim Ausführen von Abfragen (z. B. MyModel.where(...)
oder record.associated_things
) in der Konsole die tatsächlich ausgeführten Datenbankabfragen anzeigen, um besser zu verstehen, was passiert?
Antworten:
Geben Sie diese Zeile in die Konsole ein:
ActiveRecord::Base.logger = Logger.new(STDOUT)
Geben Sie diese Zeile in die Konsole ein:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
ActiveRecord::Base.logger = nil
Es gibt die .explain
Methode in Rails 4.
( .to_sql
funktioniert auch, zeigt aber keine Includes an)
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
Wille den Job macht und nicht .to_sql
. Und .explain
bietet immer noch keine SQL-Abfrage im Rohformat, die ich in der pg-Konsole ausführen kann. Aber ich brauchte die rohe Abfrage, um zu erklären und zu analysieren. Ich denke, das wird vorerst mit Erklären zu tun haben.
Seit kurzem können Sie Folgendes verwenden:
https://github.com/dejan/rails_panel
Es besteht aus einem Add-On für das Entwicklerkonsolenpanel für Chrome und einer Gem- Datei, die wie folgt zur Gemfile Ihrer Anwendung hinzugefügt werden muss :
group :development do
gem 'meta_request'
end
Dann nochmal laufen lassen:
bundle install
Starten Sie Ihre Anwendung neu, öffnen Sie sie und starten Sie die Entwicklerkonsole. Sie sollten dies folgendermaßen sehen:
Ab Rails 6 gibt es einen bequemeren Ansatz: Fügen ActiveRecord::Base.verbose_query_logs = true
Sie einfach die Konsole hinzu, und Sie sehen alle SQL-Aufrufe und Orte, an denen sie aufgerufen wurden. Weitere Informationen unter https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
Ich bevorzuge es, die Logger-Ebene einzurichten in config/application.rb
:
config.after_initialize do
Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end
Bei der Produktion wird mein ENV['LOG_LEVEL']
Wert auf den Wert von Logger::INFO
und auf meinem lokalen Computer eingestellt Logger::DEBUG
.