Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从ActiveRecord迁移中输出SQL而不执行它(不是rails!)_Ruby_Activerecord - Fatal编程技术网

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

Ruby 从ActiveRecord迁移中输出SQL而不执行它(不是rails!),ruby,activerecord,Ruby,Activerecord,有一大堆问题与此类似,都在谈论rails插件作为解决方案——但我不使用rails,请继续阅读 我在sinatra项目中有一个Rakefile,它允许我rakedb:migrate。它将完美地完成我的迁移,但我希望传递一个标志(或编写一个新的rake任务),它做同样的事情,但将SQL输出到STDOUT,并且不将更改提交到数据库。有人知道怎么做吗 我的第一个想法是尝试使用ActiveRecord日志记录,看看是否可以将SQL输出,但这行不通!有什么想法吗 namespace :db do t

有一大堆问题与此类似,都在谈论rails插件作为解决方案——但我不使用rails,请继续阅读

我在sinatra项目中有一个Rakefile,它允许我
rakedb: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

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

  • up
    down
    change
    是执行其他方法的方法;没有生成并执行的全局迁移查询字符串
  • 语句方法(
    add_column
    等)都没有将它们的语句公开为字符串;据我所知,它们是作为连接适配器方法实现的,例如mysql适配器有一个,而没有,其sql是其
    add\u列
    方法中的一个变量

  • 因此,如果您确实需要此功能,我认为您最好的选择是从日志中复制sql。

    您可以编写db:migrate任务代码吗?至少相关的部分是标准的东西,用
    要求“sinatra/activerecord/rake”实现
    可能
    rake-run-dry
    把你带向正确的方向?