Wie zeige ich SQL-Abfragen, die in der Rails-Konsole ausgeführt werden?

114

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?

Randombits
quelle
Andrew, wenn Sie auch Befehle in Broweser ausführen müssen, können Sie github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk
Siehe auch diese Antwort: stackoverflow.com/a/1576221/446106
mwfearnley

Antworten:

249

Schienen 3+

Geben Sie diese Zeile in die Konsole ein:

ActiveRecord::Base.logger = Logger.new(STDOUT)

Schienen 2

Geben Sie diese Zeile in die Konsole ein:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
John Topley
quelle
Perfekt, genau das, was ich brauchte. Haben Sie eine Empfehlung, wo Sie kleine Tricks finden können, wie diese dokumentiert sind?
Randombits
2
Dies funktioniert für Schienen 3+, aber nicht für 2, siehe stackoverflow.com/a/1576221, wenn Sie noch da sind :)
Rogerdpack
Und um es wieder zu deaktivieren: ActiveRecord::Base.logger = nil
Hula_Zell
Ich war schon so oft hier, wenn ich "Rails" in Chrom
eingebe
33

In Rails 3+ können Sie die to_sqlMethode von ActiveRecord :: Relation verwenden:

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

Es gibt die .explainMethode in Rails 4.
( .to_sqlfunktioniert 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
Seen sind
quelle
Ich habe so viel Zeit gebraucht, um herauszufinden, ob der .explainWille den Job macht und nicht .to_sql. Und .explainbietet 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.
abhishek77in
4

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: Geben Sie hier die Bildbeschreibung ein

Aleksandar Pavić
quelle
0

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::INFOund auf meinem lokalen Computer eingestellt Logger::DEBUG.

Huy Vo
quelle