Railsコンソールで実行されたSQLクエリを表示する方法は?


115

コンソールでクエリ(MyModel.where(...)またはまたはrecord.associated_things)を実行すると、実行中の実際のデータベースクエリを確認して、何が起こっているのかをより詳しく理解できますか?


アンドリュー、あなたがbroweserでコマンドを実行するためにも必要な場合に使用できるgithub.com/igorkasyanchuk/rails_dbを
イゴールKasyanchuk

この回答もご覧ください:stackoverflow.com/a/1576221/446106
mwfearnley

回答:


249

Rails 3以降

コンソールに次の行を入力します。

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

Rails 2

コンソールに次の行を入力します。

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

完璧、まさに私が必要としたもの。これらの小さなトリックが文書化されている場所を見つけるための推奨事項はありますか?
randombits


2
これはレール3+では機能しますが、2では機能しません。まだそこにいる場合は、stackoverflow.com
a / 1576221を

そして再び無効にするには: ActiveRecord::Base.logger = nil
Hula_Zell

私は何度もここにいることが多く、クロムで「rails」と入力すると、このページが上位の結果として表示されます
23tux

33

Rails 3以降では、ActiveRecord :: Relationのto_sqlメソッドを使用できます。

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

25

.explainRails 4にはメソッドがあります
.to_sql動作もしますが、インクルードは表示されません)。

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仕事をやる意志を見つけるのにとても時間がかかりました.to_sql。また.explain、pgコンソールで実行できるraw形式のSQLクエリはまだ提供されていません。しかし、説明と分析には生のクエリが必要でした。私は今のところ説明に関係していると思います。
abhishek77、

4

最近から、これを使用できます:

https://github.com/dejan/rails_panel

これは、Chrome用の開発者コンソールパネルアドオンと、次のようにアプリケーションのGemfileに追加する必要があるgemファイルで構成されています。

group :development do
  gem 'meta_request'
end

次に、もう一度実行します。

bundle install

アプリケーションを再起動して開き、デベロッパーコンソールを起動すると、次のように表示されます。 ここに画像の説明を入力してください



0

私はロガーレベルをconfig/application.rb次のように設定することを好みます:

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

本番環境でENV['LOG_LEVEL']は、の値に設定さLogger::INFOれ、ローカルマシンではになりますLogger::DEBUG

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.