Quando eseguo query (ad es. MyModel.where(...)
O record.associated_things
) nella console, come posso vedere le query di database effettive in esecuzione in modo da poter ottenere una maggiore comprensione di ciò che sta accadendo?
Quando eseguo query (ad es. MyModel.where(...)
O record.associated_things
) nella console, come posso vedere le query di database effettive in esecuzione in modo da poter ottenere una maggiore comprensione di ciò che sta accadendo?
Risposte:
Inserisci questa riga nella console:
ActiveRecord::Base.logger = Logger.new(STDOUT)
Inserisci questa riga nella console:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
ActiveRecord::Base.logger = nil
C'è il .explain
metodo in Rails 4.
( .to_sql
funziona anche lui, ma non mostra include)
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
volontà di fare il lavoro e non .to_sql
. E .explain
ancora non fornisce query sql in formato raw che posso eseguire nella console pg. Ma avevo bisogno della query grezza per spiegare e analizzare. Immagino che per ora avrò a che fare con la spiegazione.
Di recente, puoi usare questo:
https://github.com/dejan/rails_panel
Consiste del componente aggiuntivo del pannello della console per sviluppatori per Chrome e del file gem che deve essere aggiunto al Gemfile dell'applicazione in questo modo:
group :development do
gem 'meta_request'
end
Quindi esegui di nuovo:
bundle install
Riavvia la tua applicazione, aprila e avvia la console per sviluppatori e dovresti vederla così:
A partire da Rails 6 c'è un approccio più conveniente: aggiungi semplicemente ActiveRecord::Base.verbose_query_logs = true
in console e vedrai tutte le chiamate SQL e le posizioni in cui è stato chiamato. Maggiori informazioni https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs
Preferisco impostare il livello di logger in config/application.rb
:
config.after_initialize do
Rails.logger.level = (ENV['LOG_LEVEL'] || Logger::INFO).to_i
end
In produzione il mio ENV['LOG_LEVEL']
sarà impostato al valore di Logger::INFO
e sulla mia macchina locale lo sarà Logger::DEBUG
.