ruby 从Rails迁移文件中提取RAW SQL

z18hc3ub  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(80)

在Rails迁移中,我必须从Rails迁移文件中提取RAW SQL而不迁移。
这是转换示例:
在Rails迁移中:

# 20230918004257_add_some_column_to_table.rb
class AddSomeColumnToTable < ActiveRecord::Migration[6.1]
  def change
    add_column :table, :column_a, :string, comment: 'column a'
    add_column :table, :column_b, :string, comment: 'column b'
    add_column :table, :column_c, :string, comment: 'column c'
  end
end

提取的SQL:

ALTER TABLE `table` ADD `column_a` varchar(255) COMMENT 'column_a';
ALTER TABLE `table` ADD `column_b` varchar(255) COMMENT 'column_b';
ALTER TABLE `table` ADD `column_c` varchar(255) COMMENT 'column_c';

无论我在ActiveRecord::Migration中查找了多少,我都没有看到一个方法可以简单地提取SQL而不做任何其他事情。我怎么能只做一个简单的SQL提取?

wz1wpwve

wz1wpwve1#

1.要执行所有迁移查询,请使用整个文件db/structure.sql
Rails中有两种模式转储:db/schema.rbdb/structure.sql
如果你需要使用原始SQL -使用第二个。要启用此功能,请将此行添加到config/application.rb

config.active_record.schema_format = :sql

1.提取给定迁移的SQL查询的最简单方法是执行
您可以查看db/structure.sqlgit diff
从控制台运行迁移并复制输出的另一种方法

require Rails.root.join("db/migrate/20230918004257_add_some_column_to_table.rb")

AddSomeColumnToTable.new.migrate(:up)

# or like this if needed
AddSomeColumnToTable.migrate(:down)

为了防止数据库的真实的更新,您可以使用transaction Package 此代码并回滚它

ActiveRecord::Base.transaction do
  AddSomeColumnToTable.migrate(:up)
  raise # or more elegant: raise ActiveRecord::Rollback
end

也可以在Rails控制台沙箱中调用这个方法(所有更改将在退出时回滚),以进入此模式

rails c -s

相关问题