sql - rails查询 - ruby rails介绍




如何查看Ruby on Rails中给定ActiveRecord查询生成的SQL (8)

我希望看到给定的ActiveRecord Query将生成的SQL语句。 我知道我可以在查询发布后从日志中获取这些信息,但是我想知道是否有可以调用的方法和ActiveRecord Query。

例如:

SampleModel.find(:all, :select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")

我想打开irb控制台并在最后加上一个方法来显示此查询将生成的SQL,但不一定执行查询。


与Penger类似,但即使在加载了类并且记录器已被缓存后,仍可以在控制台中随时运行:

对于Rails 2:

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

对于Rails 3.0.x:

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

对于Rails> = 3.1.0,这已经在控制台中默认完成。 如果它太嘈杂,你想关闭它,你可以这样做:

ActiveRecord::Base.logger = nil

只需使用to_sql方法,它会输出将要运行的sql查询。 它在有效的记录关系上工作。

irb(main):033:0> User.limit(10).where(:username => 'banana').to_sql
=> "SELECT  "users".* FROM "users"  WHERE "users"."username" = 'banana'
LIMIT 10"

find ,它不起作用,因此您需要手动将该ID添加到查询中或使用where来运行它。

irb(main):037:0* User.where(id: 1).to_sql
=> "SELECT "users".* FROM "users"  WHERE "users"."id" = 1"

在您的主目录中创建一个.irbrc文件并将其粘贴到:

if ENV.include?('RAILS_ENV') && !Object.const_defined?('RAILS_DEFAULT_LOGGER')
  require 'logger'
  RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)
end

当你走的时候,它会将SQL语句输出到你的irb会话中。

编辑:抱歉,将仍然执行查询,但它是最接近我知道的。

编辑:现在用arel,只要对象返回ActiveRecord :: Relation并调用.to_sql就可以构建范围/方法,并且它将输出将要执行的sql。


在某处puts query_object.class一个puts query_object.class以查看您的工作对象的类型,然后查找文档。

例如,在Rails 3.0中,作用域使用具有#to_sql方法的ActiveRecord::Relation 。 例如:

class Contact < ActiveRecord::Base
  scope :frequently_contacted, where('messages_count > 10000')
end

然后,你可以做的地方:

puts Contact.frequently_contacted.to_sql

您可以更改连接的日志方法以引发异常,防止查询运行。

这是一个彻头彻尾的破解,但它似乎适用于我(Rails 2.2.2,MySQL):

module ActiveRecord
  module ConnectionAdapters
    class AbstractAdapter
      def log_with_raise(sql, name, &block)
        puts sql
        raise 'aborting select' if caller.any? { |l| l =~ /`select'/ }
        log_without_raise(sql, name, &block)
      end
      alias_method_chain :log, :raise
    end
  end
end

我常用的方法来看看它使用的是什么SQL是在SQL中引入一个“bug”,然后你会得到一个错误消息吐出到正常的记录器(和网页屏幕),有问题的SQL。 不需要找到标准输出的地方......


这可能是一个老问题,但我使用:

SampleModel.find(:all,
                 :select => "DISTINCT(*)",
                 :conditions => ["`date` > #{self.date}"], 
                 :limit=> 1, 
                 :order => '`date`',
                 :group => "`date`"
                 ).explain

explain方法将给出相当详细的SQL语句


这是我通常会在控制台中获取SQL的方法

-> script/console
Loading development environment (Rails 2.1.2)
>> ActiveRecord::Base.logger = Logger.new STDOUT
>> Event.first

当你第一次启动控制台时,你必须这样做,如果你在键入了一些代码后这样做了,它似乎不起作用

无法真正承认这一点,很久以前在别人的博客中发现,并且不记得它是谁。





activerecord