📚

RubyのSequelでの並行開発を考慮したDBマイグレーションについて考えてみる

2023/08/15に公開

今回の課題

並行開発をしていると、DBマイグレーションが一直線にならず、枝分かれしてしまう。そのため、DBマイグレーションツールとその運用について考えないといけない。
今回は、RubyのSequelというORMでのDBマイグレーションを使った場合について考えてみた。

Sequelのマイグレーターの特徴の説明

  • schema_migrationsテーブルを使って、マイグレーションの履歴を管理する。マイグレーションファイルのversionの数字が管理されている。
  • schema_migrationsテーブルに記録されていないマイグレーションファイルがあれば、そのマイグレーションファイルが実行される。
  • schema_migrationsテーブルに記録されているが、マイグレーションファイルに無いものがあればエラーとなるが、allow_missing_migration_files: trueというオプションを使うとエラーを回避できる。

解決方法

流れ

開発時

並行開発での各々の開発のDBマイグレーションを、それぞれ別ディレクトリで管理する。且つallow_missing_migration_files: trueを設定することで、別ディレクトリで管理されたマイグレーションも実行可能にする。

マージ時

※マイグレーションを一本化する必要があるため、別ディレクトリで管理していたものをマージする必要がある。

マージ時に、マイグレーションのversion(=ファイル名)を最新のversionへ変更する(ここはツールを作成し、自動化する)。
旧マイグレーションファイル名(=マージ前のマイグレーションファイル名)のversionがschema_migrationsテーブルに存在すれば、適用済みと判定しスキップする処理をマイグレーションに入れる。

マージ後のマイグレーション・ロールバック

旧マイグレーションファイル名(=マージ前のマイグレーションファイル名)のversionがあれば、schema_migrationsテーブルから削除する。
これにより、schema_migrationsテーブルに旧マイグレーションファイル名で適用されていようと新マイグレーションファイル名で適用されていようと対応が可能になる。

ツールの実装

https://github.com/momosetkn/ruby_sequel_migrations

簡単な解説

migrate_cli.rakeで、別ディレクトリでの管理、マイグレーション作成時にversionのマイグレーションへの付与、マージ(versionの割当変更とファイル移動)がCLIで行えるようになってます。
sequel_migration_ext.rbで、Sequelへのハックをしています。マイグレーション時に、旧マイグレーションファイル名を新マイグレーションファイル名へ入れ替えるメソッドを追加しています。

GitHubで編集を提案
InnoScouter(イノスカウター)Tech Blog

Discussion