Jak wyświetlić zapytania SQL uruchamiane w konsoli Railsów?

115

Kiedy uruchamiam zapytania (np. MyModel.where(...)Lub record.associated_things) w konsoli, jak mogę zobaczyć rzeczywiste zapytania do bazy danych, aby lepiej zrozumieć, co się dzieje?

randombity
źródło
Andrew, jeśli potrzebujesz również uruchamiać polecenia w przeglądarce, możesz użyć github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk
Zobacz także tę odpowiedź: stackoverflow.com/a/1576221/446106
mwfearnley

Odpowiedzi:

249

Szyny 3+

Wpisz ten wiersz w konsoli:

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

Szyny 2

Wpisz ten wiersz w konsoli:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
John Topley
źródło
Idealnie, właśnie to, czego potrzebowałem. Czy masz jakieś zalecenia, gdzie można znaleźć udokumentowane małe sztuczki, takie jak te?
randombits
2
Działa to dla szyn 3+, ale nie 2, zobacz stackoverflow.com/a/1576221, jeśli nadal tam jesteś :)
rogerdpack
I ponownie to wyłączyć: ActiveRecord::Base.logger = nil
Hula_Zell
Byłem tu tyle razy, kiedy piszę „rails” w chrome, wyświetla tę stronę jako najlepszy wynik
23tux
33

W Railsach 3+ możesz użyć to_sqlmetody ActiveRecord :: Relation :

User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"id\" = 3"
Abhi
źródło
25

Jest .explainmetoda w Railsach 4.
( .to_sqldziała też, ale nie pokazuje dołączeń)

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
źródło
Tyle czasu zajęło mi znalezienie .explaintestamentu, a nie .to_sql. I .explainnadal nie zapewnia zapytania sql w formacie surowym, które mogę uruchomić w konsoli pg. Ale potrzebowałem surowego zapytania, aby wyjaśnić i przeanalizować. Myślę, że na razie trzeba będzie wyjaśnić.
abhishek77in
4

Od niedawna możesz tego używać:

https://github.com/dejan/rails_panel

Składa się z dodatku panelu konsoli programisty dla Chrome i pliku gem, który należy dodać do pliku Gemfile aplikacji w następujący sposób :

group :development do
  gem 'meta_request'
end

Następnie uruchom ponownie:

bundle install

Uruchom ponownie aplikację, otwórz ją i uruchom konsolę programisty, a powinieneś zobaczyć to tak: wprowadź opis obrazu tutaj

Aleksandar Pavić
źródło
0

Wolę ustawić poziom rejestratora w config/application.rb:

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

Na produkcji mój ENV['LOG_LEVEL']będzie ustawiony na wartość, Logger::INFOa na moim komputerze lokalnym będzie Logger::DEBUG.

Huy Vo
źródło