与打印每个执行的sql查询的'rails server'类似,我想对rake任务执行相同的操作。
实现这一目标的最佳方法是什么?
答案 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