从ActiveRecord迁移输出SQL而不执行它(不是rails!)

时间:2013-06-25 07:32:54

标签: ruby activerecord

有很多问题类似于这个问题,谈论rails插件作为解决方案 - 但我不使用rails,继续阅读

我在sinatra项目中有一个Rakefile,允许我rake db:migrate。它会完美地完成我的迁移,但是我想传递一个标志(或编写一个新的rake任务)来执行相同的操作,但是将SQL输出到STDOUT并且不会提交对数据库的更改。有谁知道怎么做?

我的第一个想法是尝试ActiveRecord日志记录,看看我是否可以获取SQL,但这不起作用!有什么想法吗?

namespace :db do
    task :migrate_sql do
        require 'logger'

        ActiveRecord::Base.logger = Logger.new(STDOUT)

        Rake::Task['db:migrate'].invoke

        # This does the migration and doesn't output SQL - so no good!
    end
end

1 个答案:

答案 0 :(得分:0)

我认为没有任何简单的方法可以做到这一点,原因如下:

  1. updownchange是执行其他方法的方法;没有构建和执行的全局迁移查询字符串
  2. 语句方法(add_column等)都不将它们的语句公开为字符串;据我所知,它们是作为连接适配器方法实现的,例如mysql适配器有add_column_sql method,而postgresql adapter没有,它的sql是add_column方法内的变量
  3. 所以,如果你真的需要这个功能,我认为你最好的选择是从日志中复制sql。