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

标签 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. updownchange 是执行其他方法的方法;没有构建和执行的全局迁移查询字符串
  2. 语句方法(add_column 等)都没有将它们的语句公开为字符串;据我了解,它们是作为连接适配器方法实现的,例如 mysql 适配器有一个 add_column_sql method , 而 postgresql adapter没有,它的 sql 是它的 add_column 方法中的一个变量

所以,如果你真的需要这个功能,我认为你最好的选择是从日志中复制 sql。

关于ruby - 从 ActiveRecord 迁移中输出 SQL 而不执行它(不是 rails!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17291598/

相关文章:

ruby-on-rails - Rails属于

ruby-on-rails - 如果 after_initialize 回调返回 false,则返回 nil 对象

ruby-on-rails - Rails 工厂与同一对象有多个关联

ruby-on-rails - 如何在不同时区显示 Rails 表单日期时间选择?

sql - 使用 created_at 选择记录范围

ruby-on-rails - rails : Whats the easiest method to convert a serialized hash column into json column

ruby-on-rails - 如何处理 UTF-8 电子邮件 header (如主题 :) using Ruby?

ruby - Rails Grape-Swagger : get current domain for base_path

ruby - 对生产环境中不允许的参数的操作

mysql - 与事件记录中的连接相加