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