Можно ли записывать sql-запросы на рейк-задачи?

Подобно серверу rails, который печатает каждый выполненный sql-запрос, я хотел бы сделать то же самое для задач rake.

Каков наилучший способ достичь этого?

Ответ 1

В зависимости от вашей среды 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

Ответ 2

rake db:migrate  --trace

-trace покажет детали

Ответ 3

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

Ответ 5

Я пробовал это и не мог заставить его работать. Синтаксис был прекрасен, никаких ошибок, но 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. Это не мой код - Евгений Ван придумал эту технику.