[CakePHP]データベース・スキーマの管理をCakePHP Migrations Pluginで行う
最近、WiMax回線を契約して、無線LANルータを買いました。いままでUSBタイプのものを使っていたのですが、iPhoneで使えないし、Mac OS X Lion用の接続ソフトウェアがリリースされてないので頻繁に接続が切れて使えないものになっていたからです。Wifiルータならいろいろ便利で、しかも、この端末と複数の機器でLANを組むこともできます。
さて、今日は、データベース・スキーマの変更を管理するCakePHPのプラグイン「CakePHP Migration Plugin」を紹介します。インストール手順はFree CakePHP Migrations Plugin developed by the Cake Development Corporationを参考に。この記事では毎回の変更で必要な手順、気をつける必要があると思ったことについて説明します。
毎回のスキーマ変更の手順
1. 変更前のスキーマをダンプする
カレントディレクトリを アプリケーションのルートディレクトリにして次のコマンドを実行します
% cd /var/www/example.net
% cake/console/cake schema generate
APP/config/schema/schema/schema.php に現状のDBがダンプされます。データベースにまだテーブルが1つもない場合は内容も空です。(データベース自体は作っておき、接続情報をAPP/config/database.php に保存しておく必要はあります)
schema.php がすでにある場合、上書きするか別に保存するか聞かれますので、上書き(o)を選択します
Cake Schema Shell
---------------------------------------------------------------
Generating Schema...
Schema file exists.
[O]verwrite
[S]napshot
[Q]uit
Would you like to do? (o/s/q)
[s] > o
Schema file: schema.php generated
このスキーマ更新を必ずやらなくてはいけません。自動でやってくれてもいい気もしますが…
2. mysqlコンソールからCREATE TABLE, ALTER TABLE, DROP TABLE などを実行する
mysqlコンソールで普通に実行してもらってOKです。
3. もし、CREATE TABLE があれば
もし、CREATE TABLE があれば、対応するモデルが必要です。 usersテーブルをつくった場合は、models/user.php をつくり、空のモデルを定義する必要があります。この作業も必須です。
h2. 4. 差分を記録する
% cake/console/cake migration generate
この差分に名前をつけるようにいわれますので、適当に名付けます (例: add columns to implement awesome feature)
Cake Migration Shell
---------------------------------------------------------------
Please enter the descriptive name of the migration to generate:
> add column to implement awesome feature
Do you want compare the schema.php file to the database? (y/n)
[y] >
---------------------------------------------------------------
Comparing schema.php to the database...
Generating Migration...
Mapping Migrations...
Done.
schema.php とDBスキーマが比較され、差分が config/migrations/add_columns_to_implement_awesome_feature.php に保存されます
スキーマ変更の記録については以上です。新規に使い始めるときも、途中から導入するときも同じ手順でできるようです。
スキーマ変更を別環境に適用する
アプリケーションのルートディレクトリにして次のコマンドを実行します
% cake/console/cake migration run all
ほかにも1つずつ適用したり戻したりできます
% cake/console/cake migration up
% cake/console/cake migration down
気をつけないといけない点
カラム名の変更はちょっと面倒?
上記の手順は、カラム名の変更には使えません。(ALTER文実行後に上記手順を実行すると、カラムの追加と削除の扱いになり、値が引き継がれないからです)対処法として、空のマイグレーションファイルを作成して、Directive - Rename Fieldを見ながら、自分でスクリプトを書く必要がありそうです
感想
毎回スキーマのダンプをとらないといけない、CakePHPのモデルが必ず必要、と少しクセのあるツールですが、スキーマの変更自体は、ALTER文などを実行する普通の方法なので、導入は楽かな、と思います。