Doctrineのmigration機能でデータベーススキーマの差分管理
DoctrineにはRuby on Rails由来のmigration機能があります。
この機能を今まで使っていなかったので、ちょっと調べてみました。
なお、参考ドキュメントは以下ですが、このドキュメントを読むだけでは細かい挙動を把握できませんでした。
- symfony 1.x legacy website
- http://www.doctrine-project.org/projects/orm/1.2/docs/manual/migrations/ja#migrations
コマンド
migrationクラスとは?
migrationクラスには、up()とdown()メソッドがあり、それぞれ「次のバージョンへスキーマを変更する」「前のバージョンにスキーマを戻す」操作を記述します。
手作業でmigrationクラスを作って管理することもできますが、Doctrineでは自動的にmigrationクラスを生成する機能があります。
php symfony doctrine:generate-migrations-db
このコマンドでは、「現在のデータベースのスキーマ(旧)」と、「YAMLスキーマファイルのスキーマ(新)」を比較して、差分をmigrationクラスとして出力します。
php symfony doctrine:generate-migrations-models
このコマンドは、現在のモデルをすべてゼロから生成するmigrationクラス群を出力します。差分ではないことに注意が必要です。
php symfony doctrine:generate-migrations-diff
このコマンドは、「現在のモデルクラス(旧)」と、「YAMLスキーマファイルのスキーマ(新)」を比較して、差分をmigrationクラスとして出力します。
実際のケース
実際の開発において、データベースの差分管理を行う具体的な方法は以下のような感じです。
- 最初のスキーマをYAMLファイルに定義し、これに対応するモデルクラスを生成する
- ある程度FIXした状態のものを想定。これをバージョン1とします。
- 開発現場によっては、YAMLスキーマ主体ではなく、DB側主体の場合もあるかと思います。この場合でも、DBからYAML生成→モデル生成を行って下さい。
- 「php symfony doctrine:generate-migrations-models」を実行します。
- 最初のmigrationクラス群が/lib/migration/doctrineディレクトリに生成されます。
- データベースを一度削除します。(php symfony doctrine:drop-db)
- データベースを再作成します。(php symfony doctrine:build-db)
- 最初のマイグレーションを実行します。(php symfony doctrine:migrate)
- スキーマを更新します。
- 差分migrationを生成する
- migrationをDBに適用する
ポイントは最初にmigration対応にする(migration_versionテーブルの作成)ことです。