CakePHP3のDBマイグレーション
Phinx を使っている。
これは既存DBから差分を抽出する機能を持っていない。
つまり、マイグレーションの内容は手で書く必要がある。
この点はCake2時代の CakeDC Migration プラグインや、Symfony2に劣っている。
Phinx の記述方法自体はシンプルでわかりやすいので、
単純なスキーマ変更程度ならサクサク書ける。
初回の準備
./bin/cake bake migration_snapshot Initial
config/Migrations/YmdHis_initial.php
が生成される。
既存のスキーマが書かれている。
DB上には、マイグレーション用の phinxlog テーブルが作成される。
ファイル名のタイムスタンプ部分がUTCなのが気になるが。
このタイムスタンプ部分がマイグレーションIDとなる。
適用状態確認
./bin/cake migrations status
down が未適用、up が適用済み。
差分のテンプレ作成
初回以降はこれでテンプレを作り、内容を記述していくことになる。
./bin/cake bake migration <migration name>
差分適用
すべてを適用
./bin/cake migrations migrate
migration id を指定して、その時点までの適用ができる
./bin/cake migrations migrate <migration-id>
rollback
最後のマイグレーションを rollback
./bin/cake migrations rollback
migration id を指定してその時点までのrollback実行ができる
./bin/cake migrations rollback <migration-id>
記述方法
up()
にマイグレーション処理を、down()
にロールバック処理を書く。
基本的には初期スキーマファイルと、IDEのメソッド補完でなんとかなる。
テンプレで作られる change()
は、マイグレーション処理を書く。
up()
との違いは、内容を自動的に判別してロールバックするのでこれひとつで済むこと。
・・なのだが、この自動判別には制限があるらしく、ロールバックできない処理も存在する。
(たとえば ALTER TABLE table CHANGE colmn ...
)
対応しているかどうかは change()
に記述して、マイグレーションとロールバックを両方試してみるのが確実。
対応していない処理が書かれていた場合には、ロールバックが失敗してその旨エラーが出る。
そういう場合は up()
と down()
でやることになる。