¿Es posible registrar consultas de SQL en tareas de rake?

Similar al ‘servidor de Rails’ que imprime cada consulta de SQL ejecutada, me gustaría hacer lo mismo para las tareas de rake.

¿Cuál es la mejor manera de lograrlo?

Dependiendo de su entorno, Rake registrará consultas de SQL al igual que cualquier proceso de Rails y en el mismo archivo de registro. Entonces, en su caja de desarrollo, verifique su archivo log / development.log, que contendrá las consultas de su tarea de Rake. Si desea que las consultas se registren en la producción, establezca el nivel de registro en su tarea de Rake en DEBUG y asegúrese de que la tarea de rake depende del entorno:

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

El rastro mostrará los detalles.

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

Probé lo anterior y no pude hacerlo funcionar. La syntax estaba bien, no había errores, pero ningún sql llegó a la salida estándar (o al registro). Estoy usando Rails 3.2. También estoy corriendo en un entorno de producción.

Para ver las consultas de SQL generadas por mis tareas de rake, utilicé la técnica que se encuentra en http://eewang.github.io/blog/2013/07/29/how-to-use-rake-tasks-to-generate-migration -sql /

En particular, acabo de insertar este bloque en mi tarea antes de las sentencias find () que generaron las consultas SQL en las que me interesé:

  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 

Entonces pude ver el SQL en la salida estándar. Este no es mi código: a Eugene Wang se le ocurrió esta técnica.

Posible duplicado: ¿ es posible generar los scripts de cambio de SQL que rake db: migrate produce?

Hay algunas buenas opciones allí. Mi favorito, por supuesto, es mi respuesta.

La respuesta correcta es poner esto al comienzo de la tarea de rake:

 ActiveRecord::Base.logger = Logger.new STDOUT