是否可以在rake任务上记录sql查询?

时间:2011-11-23 21:54:56

标签: ruby-on-rails

与打印每个执行的sql查询的'rails server'类似,我想对rake任务执行相同的操作。

实现这一目标的最佳方法是什么?

7 个答案:

答案 0 :(得分:15)

根据您的环境,Rake将记录SQL查询,就像任何Rails进程将&在同一个日志文件中。所以在你的开发箱上,检查你的log / development.log文件 - 它将包含你的Rake任务的查询。如果要在生产中记录查询,请将Rake任务中的日志级别设置为DEBUG,并确保rake任务取决于:environment。

desc "Task with SQL logging"
task :test_log => :environment do
  Rails.logger.level = Logger::DEBUG
  Your code here...
end

答案 1 :(得分:5)

rake db:migrate  --trace

--trace将显示详细信息

答案 2 :(得分:4)

echo '' > log/development.log
rake db:migrate:redo VERSION=20141017153933
cat log/development.log

答案 3 :(得分:1)

我尝试了上述内容并且无法使其发挥作用。语法很好,没有错误,但没有sql来到stdout(或日志)。我使用的是rails 3.2。我也在生产环境中运行。

要查看我的rake任务生成的sql查询,我使用了http://eewang.github.io/blog/2013/07/29/how-to-use-rake-tasks-to-generate-migration-sql/

中的技术

特别是,我刚刚在生成我所讨论的SQL查询的find()语句之前在我的任务中插入了这个块:

  ActiveRecord::Base.connection.class.class_eval do
    # alias the adapter's execute for later use
    alias :old_execute :execute

    # define our own execute
    def execute(sql, name = nil)
      print "===== #{sql}\n"
      old_execute sql, name
    end
  end

然后我可以在stdout上看到SQL。这不是我的代码 - Eugene Wang提出了这种技术。

答案 4 :(得分:1)

可能重复:is it possible to output the sql change scripts that rake db:migrate produces?

那里有一些不错的选择。我最喜欢的当然是我的答案。

答案 5 :(得分:1)

正确的答案是将其放在rake任务的开头:

ActiveRecord::Base.logger = Logger.new STDOUT

答案 6 :(得分:0)

您可以创建以下任务 (lib/tasks/db.rake):

task :show_sql do
  ActiveRecord::Base.logger = Logger.new STDOUT
end

并像这样使用它:

$ bin/rake show_sql db:migrate