マイグレーションはテーブルの作成・削除・変更を行うものです。バージョン管理を行い、コマンド一発で最新まで適用などできるため、複数人で開発してる時など少し便利です。また、下記のようなデータベースごとの差異をある程度抽象化します。
- 予約語の扱い(`で囲んだり"で囲んだり)
- オートインクリメント(シーケンス)の定義
- Sabelで型変換を可能にするための定義(Boolean型, Date型など)
マイグレーションファイルは
migration/コネクションネーム の下に設置します。ファイル名は
{バージョン}_{モデル名}_{コマンド}.php の形式になります。(SQLを発行するqueryコマンドの場合は
{バージョン}_query.php となります。)
・コマンド一覧
- create - テーブル作成
- drop - テーブル削除
- addColumn - カラム追加
- dropColumn - カラム削除
- changeColumn - カラム変更
- query - SQL実行
テーブル作成例(
migration/default/1_User_create.php)
<?php
$create->column("id")->type(_INT)->primary(true)->increment(true);
$create->column("name")->type(_STRING)->length(16)->nullable(false);
$create->column("age")->type(_SMALLINT)->nullable(false)->value(0);
$create->column("is_active")->type(_BOOL)->nullable(false)->value(true);
$create->column("added")->type(_DATEITIME)->nullable(false);
- column() - カラム名を指定
- type() - カラム型を指定
- length() - 最大文字数を指定(省略時:255)
- nullable() - 省略可/不可を指定(省略時:true)
- value() - 省略された時のデフォルト値を指定(省略時:NULL)
- primary() - プライマリキーの指定(省略時:false)
- increment() - シーケンス(オートインクリメント)の指定(省略時:false)
複合キーの場合は下記のようにカラム名の配列で指定します。なお、プライマリキーに指定されたカラムは自動的にnullable(false)となります。
$create->primary(array("col1", "col2"));
ユニーク制約は unique() で行うことができます。配列で複数のカラムからなるユニーク制約の定義も可能です。
$create->unique("col1");
$create->unique(array("col2", "col3"));
MySQLの場合、options() でテーブルエンジンを指定することが可能です。なお、この options("engine", "...") は他のデータベースに実行した場合は無視されます。
$create->options("engine", "InnoDB");
カラム追加例(
migration/default/2_User_addColumn.php)
<?php
$add->column("addcol1")->type(_STRING);
$add->column("addcol2")->type(_FLOAT)->value(3.14159265);
カラム削除例(
migration/default/3_User_dropColumn.php)
<?php
$drop->column("addcol1");
$drop->column("addcol2");
カラム定義を変更するには、現在のカラム定義から変更したい属性のみを再定義します。下記はnameカラムの最大文字数を32文字にする例です。(
migration/default/4_User_changeColumn.php)
<?php
$change->column("name")->length(32);
※カラム定義の変更が正常に実行されるかどうかはデータベースや状況によって異なることがあります。
例えばNULL値が存在するカラムをNOT NULLに変更する時、実行されるデータベースとそうでない(エラーになる)ものがあります。
queryコマンドを使用するとSQLを発行することができるので、抽象化されない特殊なDDLステートメントを実行したい場合に有用です。upgrade時に実行されるSQLとdowngrade時に実行されるSQLを記述します。(複数記述することも可能です)
$query->upgrade("CREATE BITMAP INDEX tbl_col_bmidx ON tbl(col)");
$query->upgrade("...");
$query->upgrade("...");
$query->downgrade("...");
$query->downgrade("...");
$query->downgrade("DROP INDEX tbl_col_bmidx");
関連項目