Подобно серверу rails, который печатает каждый выполненный sql-запрос, я хотел бы сделать то же самое для задач rake.
Каков наилучший способ достичь этого?
Подобно серверу rails, который печатает каждый выполненный sql-запрос, я хотел бы сделать то же самое для задач rake.
Каков наилучший способ достичь этого?
В зависимости от вашей среды Rake будет регистрировать SQL-запросы, как и любой процесс Rails, и в том же файле журнала. Итак, в вашем блоке dev, проверьте файл log/development.log - он будет содержать ваши запросы на задачу Rake. Если вы хотите, чтобы запросы регистрировались в процессе производства, установите уровень журнала в задаче Rake на DEBUG и убедитесь, что задача rake зависит от среды.
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, которые выгружают db: migrate?
Там есть хорошие варианты. Мой любимый, конечно, мой ответ.
Я пробовал это и не мог заставить его работать. Синтаксис был прекрасен, никаких ошибок, но sql не приходил в stdout (или журнал). Я использую рельсы 3.2. Я также работаю в производственной среде.
Чтобы увидеть sql-запросы, сгенерированные моими рейк-задачами, я использовал технику, найденную в http://eewang.github.io/blog/2013/07/29/how-to-use-rake-tasks-to-generate-migration-sql/
В частности, я просто вставил этот блок в свою задачу перед операциями find(), которые сгенерировали SQL-запросы, в которые я был проиндексирован:
ActiveRecord::Base.connection.class.class_eval do
# alias the adapter 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
Тогда я мог видеть SQL на stdout. Это не мой код - Евгений Ван придумал эту технику.