スキーマファイルをSQL形式に変更する

Railsアプリのスキーマファイルはデータベースの現在のスキーマを表し、デフォルトではdb/schema.rbにActiveRecordのDSLで記述されている。スキーマファイルはrails db:schema:dumpで生成されるものなので、開発者が直接いじってはならない。

開発が進みデータベースのスキーマが複雑になると、ActiveRecordのDSLでの表現に限界が出てくる。DSLのメリットはデータベースに依存せず抽象的な表現ができることだが、データベース固有の設定をする場合にDSLで表現できなくなってくる。

DSLで表現できなくなるとスキーマファイルと実際のスキーマに乖離が生まれる。スキーマに乖離があると、開発環境やCI上でデータベースをセットアップするのが困難になる。

そこで、ActiveRecordはスキーマファイルの形式にSQLを選ぶことができる。config/application.rbで以下のように指定すると、db/structure.sqlというSQL形式のスキーマファイルが生成される。

config.active_record.schema_format = :sql

なお、この設定はデフォルトでは:rubyが指定されている。

SQL形式に変更した場合、コマンドを以下のように変える必要がある。

Ruby形式 SQL形式
rails db:schema:load rails db:structure:load
rails db:schema:dump rails db:structure:dump

また、db/structure.sqlの生成にはDBごとのスキーマダンプツールを使うため、MySQLであればmysqldumpを用意する必要がある。