Rails 7: rails db:schema:dump
やload
のスキーマ形式を環境変数で指定可能になった(翻訳)
Railsはときどきbreaking changesを導入することがあります。ほぼ2年前、Railsチームはrails db:structure:dump
およびrails db:structure:load
タスクを非推奨化してrails db:schema:dump
およびrails db:schema:load
に一元化する決断を下しました(#39470)。これは"May of WTFs"という戦略の一環で、Railsを使うときに出くわす多くの「これは何だ?(WTF)」を減らすことが目的です。対象となったWTFのひとつがDb:schema vs db:structureで、これはスキーマダンプ機能の冗長な部分を削減することについての議論です。
Railsにはdb:schema:{dump,load}
とdb:structure:{dump,load}
という独立したタスクがあります。db:schema
はデータベースをRubyフォーマットで読み書きしますが、db:structure
はSQLフォーマットで読み書きします。そして、これら2つのタスクを1つのタスクにまとめ、フォーマットはconfig.active_record.schema_format
で指定するようにすることが決定されました。
一見良い話のように思えますが、@jeremyがGitHubで以下のように指摘しているように、読み込みやダンプをフォーマットごとに異なるタスクで行うことにはれっきとした理由があったのです。
- (配布目的などで)schema.rbを取得するために
db:schema:dump
を呼び出すアプリ・エンジン・CIフローなどが、意図せずstructure.sqlファイルを取得してしまう可能性がある。 - (Dockerデータベースを高速起動するなどの目的で)structure.sqlダンプも追加で生成するワークフローが利用できなくなってしまう。
これは、読み込みやダンプのスキーマフォーマットがRailsコンフィグを使わないと変更できなくなり、システムの外部から指定できなくなったためです。
改修前
Railsでdb:structure:load
タスクとdb:structure:dump
タスクが非推奨化された後、手順は以下のように変わりました。
- db/schema.rbファイルを生成する場合:
config.active_record.schema_format
コンフィグで:ruby
を指定してからrails db:schema:dump
を実行する - db/structure.sqlファイルを生成する場合:
config.active_record.schema_format
コンフィグで:sql
を指定してからrails db:schema:dump
を実行する
改修後
以下のように環境変数で手軽にスキーマフォーマットを指定できるようになりました(#44834)。
- db/schema.rbファイルを生成する場合:
ENV["SCHEMA_FORMAT"]
にruby
を設定してからrails db:schema:dump
を実行する - db/structure.sqlファイルを生成する場合:
ENV["SCHEMA_FORMAT"]
にsql
を設定してからrails db:schema:dump
を実行する
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
参考: 週刊Railsウォッチ20220411:
db:schema
のダンプや読み込みのスキーマフォーマットを環境変数で指定できるようになったこの#44834は、Rails 7.0.4(7-0-stableブランチ)に含まれています。