Khi tôi chạy các truy vấn (ví dụ: MyModel.where(...)
hoặc record.associated_things
) trong bảng điều khiển, làm cách nào tôi có thể thấy các truy vấn cơ sở dữ liệu thực tế đang được chạy để tôi có thể hiểu thêm về những gì đang xảy ra?
Khi tôi chạy các truy vấn (ví dụ: MyModel.where(...)
hoặc record.associated_things
) trong bảng điều khiển, làm cách nào tôi có thể thấy các truy vấn cơ sở dữ liệu thực tế đang được chạy để tôi có thể hiểu thêm về những gì đang xảy ra?
Câu trả lời:
Nhập dòng này vào bảng điều khiển:
ActiveRecord::Base.logger = Logger.new(STDOUT)
Nhập dòng này vào bảng điều khiển:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
ActiveRecord::Base.logger = nil
Có .explain
phương thức trong Rails 4.
( .to_sql
cũng hoạt động, nhưng sẽ không hiển thị bao gồm)
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
chí làm công việc và không .to_sql
. Và .explain
vẫn không cung cấp truy vấn sql ở định dạng thô mà tôi có thể chạy trong bảng điều khiển pg. Nhưng tôi cần truy vấn thô để giải thích và phân tích. Tôi đoán sẽ phải làm với giải thích cho bây giờ.
Từ gần đây, bạn có thể sử dụng cái này:
https://github.com/dejan/rails_panel
Nó bao gồm tiện ích bổ sung bảng điều khiển dành cho nhà phát triển dành cho chrome và tệp gem cần được thêm vào Gemfile của ứng dụng của bạn như sau:
group :development do
gem 'meta_request'
end
Sau đó chạy lại:
bundle install
Khởi động lại ứng dụng của bạn, mở nó và khởi chạy bảng điều khiển dành cho nhà phát triển và bạn sẽ thấy nó như sau:
Bắt đầu từ Rails 6, có một cách tiếp cận thuận tiện hơn: chỉ cần thêm ActiveRecord::Base.verbose_query_logs = true
vào bảng điều khiển và bạn sẽ thấy tất cả các lệnh gọi SQL và những nơi mà nó được gọi. Thông tin thêm https://guides.rubyonrails.org/debugging_rails_application.html#verbose-query-logs
Tôi thích thiết lập cấp trình ghi nhật ký trong config/application.rb
:
config.after_initialize do
Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end
Khi sản xuất ENV['LOG_LEVEL']
, giá trị của tôi sẽ được đặt thành giá trị Logger::INFO
và trên máy cục bộ của tôi, nó sẽ như vậy Logger::DEBUG
.