CakePHP3のマイグレーション機能でDBから自動で差分取得
はじめに
CakePHP3 にはデータベースのマイグレーション機能があります。これを使えば DB のバージョン管理や共有が簡単にできます。この機能は「Phinx」というツールが利用されていて、bake コマンドを使って実行します。
今日は対象者として、テーブルの追加/削除などは phpMyAdmin や MySQL で行っている人を想定し、CakePHP3 でDBからエクスポートするコマンドと、ファイルから適用するコマンドをご紹介します。
1. 初回のDB構造エクスポート
初回時は、下記のコマンドでデータベースの構造すべてを出力します。
$ bin/cake bake migration_snapshot Initial
上記コマンドを実行すると、config/Migrations/20190901123234_Initial.php という感じのファイルが生成されます。
2. DB構造の差分をエクスポート
DBに変更を加えた場合には、下記コマンドで自動的に差分を出力できます。
コマンド最後の「MigrationName」はマイグレーションファイルに付与されるもので、ファイル名は config/Migrations/20190901113452_MigrationName.php のようになります。差分内容に合わせて適切な名称を入れてください。
$ bin/cake bake migration_diff MigrationName
3. 構造エクスポート時の注意
フィールドにtinyint型がある場合、インポート時に、下記のようなエラーになります。
InvalidArgumentException: An invalid column type "tinyinteger" was specified for column "id"
この場合は、下記のように use Phinx\Db\Adapter\MysqlAdapter; を use Migrations\AbstractMigration; の下部に追記し、当該フィールドの 'tinyinteger' を 'integer' に変更。
そして、limit の値を、それぞれ MysqlAdapter::INT_TINY に変更してください。
# use Migrations\AbstractMigration; の下に追加
use Phinx\Db\Adapter\MysqlAdapter;
# tinyint型 のフィールドを修正
->addColumn('id', 'integer', [ # ← tinyinteger から integer に変更
'default' => null,
'limit' => MysqlAdapter::INT_TINY, # ← 変更
'null' => false,
])
4. データのエクスポート
データのエクスポートは、下記コマンドで行います。
例: categories テーブルの場合
$ bin/cake bake seed --data Categories
上記コマンドを実行すると、config/Seeds/CategoriesSeed.php というファイルが生成されます。
2回目以降は、下記のようにファイルを上書きするか尋ねられます。問題がなければ「y」キーを押して上書き保存します。
$ bin/cake bake seed --data Categories
File `/path/to/cake3project/config/Seeds/CategoriesSeed.php` exists
Do you want to overwrite? (y/n/a/q)
[n] >
5. 構造のインポート
下記コマンドで、データベースに構造のインポートができます。
$ bin/cake migrations migrate
6. データのインポート
下記コマンドで、各テーブルのデータをインポートできます。 ただし、対象テーブルにデータが入っている状態で実行するとエラーが出る場合があるので注意が必要です。
$ bin/cake migrations seed