【问题标题】:How to show SQL queries run in the Rails console?如何显示在 Rails 控制台中运行的 SQL 查询?
【发布时间】:2011-02-25 12:46:48
【问题描述】:

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

【问题讨论】:

标签: ruby-on-rails activerecord


【解决方案1】:

Rails 3+

在控制台输入这一行:

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

导轨 2

在控制台输入这一行:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    Rails 4 中有 .explain 方法。
    .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 仍然不提供原始格式的 sql 查询,我可以在 pg 控制台中运行。但我需要原始查询来解释和分析。我想现在与解释有关。
    【解决方案4】:

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

    【讨论】:

    • 应该没有必要再打开它了,因为它现在应该默认开启:“Rails 5.2 之后的开发环境日志中默认启用详细查询日志。”
    【解决方案5】:

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

    https://github.com/dejan/rails_panel

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

    group :development do
      gem 'meta_request'
    end
    

    然后再次运行:

    bundle install
    

    重新启动您的应用程序,打开它,然后启动开发者控制台,您应该会看到如下所示:

    【讨论】:

      【解决方案6】:

      我只是想为我们的生产控制台提供我在 dev 上习惯的相同行为,所有 SQL 查询都报告给控制台。

      Rails.logger.level = 0

      【讨论】:

        【解决方案7】:

        我更喜欢在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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-20
          • 1970-01-01
          • 2022-10-04
          • 2018-04-24
          • 2014-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多