Bagaimana cara menampilkan kueri SQL yang dijalankan di konsol Rails?

115

Ketika saya menjalankan kueri (mis. MyModel.where(...)Atau record.associated_things) di konsol, bagaimana saya dapat melihat kueri basis data yang sebenarnya sedang dijalankan sehingga saya dapat memperoleh lebih banyak pemahaman tentang apa yang terjadi?

randombit
sumber
Andrew, jika Anda juga perlu menjalankan perintah di browser, Anda dapat menggunakan github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk
Lihat juga jawaban ini: stackoverflow.com/a/1576221/446106
mwfearnley

Jawaban:

249

Rel 3+

Masukkan baris ini di konsol:

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

Rel 2

Masukkan baris ini di konsol:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
John Topley
sumber
Sempurna, hanya yang saya butuhkan. Punya rekomendasi kemana harus mencari trik kecil seperti ini yang didokumentasikan?
randombits
2
Ini berfungsi untuk rel 3+ tetapi tidak 2, lihat stackoverflow.com/a/1576221 jika Anda masih di sana :)
rogerdpack
Dan untuk menonaktifkannya lagi: ActiveRecord::Base.logger = nil
Hula_Zell
Saya sudah sering ke sini, saat saya mengetik "rel" di chrome, halaman ini akan ditampilkan sebagai hasil teratas
23tux
33

Di Rails 3+ Anda dapat menggunakan to_sqlmetode ActiveRecord :: Relation :

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

Ada .explainmetode di Rails 4.
( .to_sqlberfungsi juga, tetapi tidak akan ditampilkan termasuk)

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
danau
sumber
Saya membutuhkan begitu banyak waktu untuk menemukan .explainkemauan melakukan pekerjaan itu dan tidak .to_sql. Dan .explainmasih tidak menyediakan query sql dalam format mentah yang dapat saya jalankan di konsol pg. Tapi saya membutuhkan kueri mentah untuk menjelaskan dan menganalisis. Saya kira harus dilakukan dengan menjelaskan untuk saat ini.
abhishek77in
4

Mulai baru-baru ini, Anda dapat menggunakan ini:

https://github.com/dejan/rails_panel

Ini terdiri dari add-on panel konsol pengembang untuk chrome, dan file permata yang perlu ditambahkan ke Gemfile aplikasi Anda seperti ini:

group :development do
  gem 'meta_request'
end

Lalu jalankan lagi:

bundle install

Mulai ulang aplikasi Anda, buka, dan luncurkan konsol pengembang, dan Anda akan melihatnya seperti ini: masukkan deskripsi gambar di sini

Aleksandar Pavić
sumber
0

Saya lebih suka mengatur level logger di config/application.rb:

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

Saat produksi, ENV['LOG_LEVEL']keinginan saya disetel ke nilai Logger::INFOdan pada mesin lokal saya Logger::DEBUG.

Huy Vo
sumber