マイグレーション(テーブル定義)| Database

マイグレーションはテーブルの作成・削除・変更を行うものです。バージョン管理を行い、コマンド一発で最新まで適用などできるため、複数人で開発してる時など少し便利です。また、下記のようなデータベースごとの差異をある程度抽象化します。
  • 予約語の扱い(`で囲んだり"で囲んだり)
  • オートインクリメント(シーケンス)の定義
  • 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");

関連項目