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

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

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

根据您的环境,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 
 rake db:migrate --trace 

–trace将显示详细信息

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

我尝试了以上内容,无法让它发挥作用。 语法很好,没有错误,但没有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提出了这种技术。

可能重复: 是否可以输出rake db:migrate产生的sql更改脚本?

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

正确的答案是把它放在rake任务的开头:

 ActiveRecord::Base.logger = Logger.new STDOUT