Como mostrar consultas SQL rodando no console Rails?


115

Quando executo consultas (por exemplo, MyModel.where(...)ou record.associated_things) no console, como posso ver as consultas reais do banco de dados sendo executadas para obter mais compreensão do que está acontecendo?


Andrew, se você também precisar executar comandos no broweser, pode usar github.com/igorkasyanchuk/rails_db
Igor Kasyanchuk

Veja também esta resposta: stackoverflow.com/a/1576221/446106
mwfearnley

Respostas:


249

Rails 3+

Insira esta linha no console:

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

Rails 2

Insira esta linha no console:

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

Perfeito, exatamente o que eu precisava. Tem alguma recomendação de onde ir para encontrar pequenos truques como esses documentados?
randombits


2
Isso funciona para rails 3+, mas não 2, consulte stackoverflow.com/a/1576221 se você ainda estiver lá :)
rogerdpack

E para desativá-lo novamente: ActiveRecord::Base.logger = nil
Hula_Zell

Já estive aqui tantas vezes, quando digito "rails" no cromo, ele exibe esta página como o resultado principal
23tux

33

No Rails 3+ você pode usar o to_sqlmétodo ActiveRecord :: Relation :

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

25

Existe o .explainmétodo no Rails 4.
( .to_sqlfunciona também, mas não mostra inclui)

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

Levei muito tempo para encontrar a .explainvontade do trabalho e não .to_sql. E .explainainda não fornece consulta sql em formato raw que posso rodar no console pg. Mas eu precisava da consulta bruta para explicar e analisar. Eu acho que vai ter a ver com explicar por enquanto.
abhishek77 em

4

Recentemente, você pode usar isto:

https://github.com/dejan/rails_panel

Ele consiste em um complemento do painel do console do desenvolvedor para cromo e um arquivo gem que precisa ser adicionado ao Gemfile do seu aplicativo como este:

group :development do
  gem 'meta_request'
end

Em seguida, execute novamente:

bundle install

Reinicie seu aplicativo, abra-o e inicie o console do desenvolvedor, e você deve vê-lo assim: insira a descrição da imagem aqui



0

Eu prefiro configurar o nível de logger em config/application.rb:

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

Na produção, meu ENV['LOG_LEVEL']será definido como o valor de Logger::INFOe na minha máquina local será Logger::DEBUG.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.