如何在Rails控制台中显示SQL查询?

ran*_*its 98 activerecord ruby-on-rails

当我在控制台中运行查询(例如MyModel.where(...)record.associated_things)时,如何查看正在运行的实际数据库查询,以便我可以更好地了解正在发生的事情?

Joh*_*ley 223

Rails 3+

在控制台中输入以下行:

ActiveRecord::Base.logger = Logger.new(STDOUT)
Run Code Online (Sandbox Code Playgroud)

Rails 2

在控制台中输入以下行:

ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
Run Code Online (Sandbox Code Playgroud)

  • 当然.http://slash7.com/2006/12/21/secrets-of-the-rails-console-ninjas/和http://stackoverflow.com/questions/123494/whats-your-favourite-irb-trick Plus http ://railscasts.com/总是很好. (2认同)
  • 这适用于rails 3+而不是2,如果你还在那里,请参阅http://stackoverflow.com/a/1576221 :) (2认同)

Abh*_*bhi 28

在Rails 3+中,您可以使用ActiveRecord :: Relation的to_sql方法:

User.where(:id => 3).to_sql
#=> "SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"id\" = 3"
Run Code Online (Sandbox Code Playgroud)


lak*_*are 21

.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
Run Code Online (Sandbox Code Playgroud)


Noa*_*man 19

我只是想让我们的生产控制台具有与我在开发时使用的相同行为,其中所有 SQL 查询都会报告给控制台。

\n

Rails.logger.level = 0

\n
3.0.3 :001 > Rails.logger.level = 0\n => 0\n3.0.3 :002 > User.last\n  User Load (0.7ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1\n => #<User:\xe2\x80\xa6>\n
Run Code Online (Sandbox Code Playgroud)\n

  • 相当于 `Rails.logger.level = :debug` (4认同)

小智 7

从 Rails 6 开始,有更方便的方法:只需ActiveRecord::Base.verbose_query_logs = true在控制台中添加,您将看到所有 SQL 调用以及调用它的位置。更多信息https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs

  • 此方法确实已被弃用,但它已[移出`AR::Base`](https://github.com/rails/rails/commit/c3f43075a3c70c3b11717741426ec38a8d3cd14a),现在可作为`ActiveRecord.verbose_query_logs`使用轨道 7.0。 (2认同)

Ale*_*vić 6

从最近开始,您可以使用这个:

https://github.com/dejan/rails_panel

它由 chrome 的开发者控制台面板插件和 gem 文件组成,需要将其添加到应用程序的Gemfile中,如下所示:

group :development do
  gem 'meta_request'
end
Run Code Online (Sandbox Code Playgroud)

然后再次运行:

bundle install
Run Code Online (Sandbox Code Playgroud)

重新启动您的应用程序,打开它,然后启动开发人员控制台,您应该看到如下所示: 在此输入图像描述