Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7: rails db:schema:dumpやloadのスキーマ形式を環境変数で指定可能になった(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

参考: 週刊Railsウォッチ20220411: db:schemaのダンプや読み込みのスキーマフォーマットを環境変数で指定できるようになった

この#44834は、Rails 7.0.4(7-0-stableブランチ)に含まれています。

Rails 7: rails db:schema:dumploadのスキーマ形式を環境変数で指定可能になった(翻訳)

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: db:structure:loadとdb:structure:dumpタスクが非推奨化(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。