はじめに
Recursionでマイグレーションシステムの仕組みを理解したので、復習用にメモとして残しておく。
1. 管理構成
マイグレーションは以下の2つで管理されている。
-
マイグレーションフォルダ
実行対象のマイグレーションファイル(PHPクラス)を保存する場所。ファイル名には日付を含めて昇順で並ぶようにする。
-
マイグレーションテーブル
データベース内で、実行済みのマイグレーションファイルのファイル名を記録するテーブル。
この2つを比較することで、どのマイグレーションが未実行なのかを判断する。
2. migrate の流れ
-
migrations
テーブルから「最後に実行されたマイグレーションファイル名」を取得する。 - フォルダ内のすべてのマイグレーションファイルを取得し、ファイル名の昇順にソートする。
- テーブルに記録されたファイルが、フォルダ内の何番目のファイルなのか(インデックス)を調べる。
- そのインデックスの次から最後までのファイルを、順に
up()
実行していく。 - 実行が終わるたびに、
migrations
テーブルにそのファイル名を INSERT して記録する。
※ テーブルに実行履歴が一切なければ、最初のファイルからすべて実行される。
3. rollback の流れ
-
migrations
テーブルから「最後に実行されたマイグレーションファイル名」を取得する。 - フォルダ内のマイグレーションファイル一覧を取得し、昇順にソートする。
- 該当ファイルが何番目のファイルか(インデックス)を調べる。
- そのインデックスから逆方向(デクリメント)に
down()
を実行していく。 - 実行が終わるたびに、
migrations
テーブルからそのファイル名を DELETE して履歴を消す。
※ rollback の実行回数は引数で指定できる(デフォルトは 1 回)。
4. 命名ルールと注意点
- マイグレーションファイル名には日付(またはソート可能な接頭辞)を含める。
- ファイルはフォルダ内で昇順にソートされて実行される。
- クラス名はファイル名を元に動的に生成されるため、命名規則に従う必要がある。
-
up()
/down()
メソッドの中で、スキーマ変更を行う SQL クエリを記述する。
5. この設計の利点
- 実行状態を DB 側で正確に管理できる(ファイルの存在だけでは判断しない)。
- 実行・巻き戻しがコマンド1つで可能。