Come mostrare le query SQL eseguite nella console di Rails?


115

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?


Andrew, se hai bisogno anche di eseguire comandi in broweser puoi usare github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk

Vedi anche questa risposta: stackoverflow.com/a/1576221/446106
mwfearnley

Risposte:


249

Rails 3+

Inserisci questa riga nella console:

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

Rotaie 2

Inserisci questa riga nella console:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)

Perfetto, proprio quello di cui avevo bisogno. Hai qualche consiglio su dove andare a trovare piccoli trucchi come questi sono documentati?
Randombits


2
Funziona per rails 3+ ma non 2, vedi stackoverflow.com/a/1576221 se sei ancora lì :)
rogerdpack

E per disabilitarlo nuovamente: ActiveRecord::Base.logger = nil
Hula_Zell

Sono stato qui così tante volte, quando
digito

33

In Rails 3+ puoi usare il to_sqlmetodo di ActiveRecord :: Relation :

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

25

C'è il .explainmetodo in Rails 4.
( .to_sqlfunziona 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

Mi ci è voluto così tanto tempo per trovare la .explainvolontà di fare il lavoro e non .to_sql. E .explainancora 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.
abhishek77 nel

4

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ì: inserisci qui la descrizione dell'immagine



0

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::INFOe sulla mia macchina locale lo sarà Logger::DEBUG.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.