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?


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)

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"

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

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



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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.