Techioz Blog

Rails移行ファイルからのRAW SQLの抽出

概要

Rails Migration では、移行せずに Rails Migration ファイルから 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 抽出を実行するにはどうすればよいですか?

解決策

Rails には 2 種類のスキーマ ダンプがあります: db/schema.rb と db/structural.sql

生の SQL を使用する必要がある場合は、2 番目の SQL を使用してください。この機能を有効にするには、次の行を config/application.rb に追加します。

config.active_record.schema_format = :sql

db/ Structure.sql の git 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)

データベースが実際に更新されないようにするには、このコードをトランザクションでラップしてロールバックします。

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

また、Rails コンソール サンドボックス内でこのメソッドを呼び出して (すべての変更は終了時にロールバックされます)、このモードに入ることができます。

rails c -s