RubyのSequelでの並行開発を考慮したDBマイグレーションについて考えてみる
今回の課題
並行開発をしていると、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テーブルに旧マイグレーションファイル名で適用されていようと新マイグレーションファイル名で適用されていようと対応が可能になる。
ツールの実装
簡単な解説
migrate_cli.rakeで、別ディレクトリでの管理、マイグレーション作成時にversionのマイグレーションへの付与、マージ(versionの割当変更とファイル移動)がCLIで行えるようになってます。
sequel_migration_ext.rbで、Sequelへのハックをしています。マイグレーション時に、旧マイグレーションファイル名を新マイグレーションファイル名へ入れ替えるメソッドを追加しています。
株式会社InnoScouterのTech Blogです。 組織から「できない」をなくすをミッションに、大企業とスタートアップ企業の連携をサポートするSaaS「InnoScouter」を提供しています。 採用情報はこちら herp.careers/v1/innoscouter/inPUbSL4Bofu
Discussion