Yii-database-migration
Yii-データベースの移行
データベース駆動型アプリケーションの開発中、データベース構造はソースコードとともに進化します。 Yiiは、データベースの変更を追跡できる database migration 機能を提供します。
Yiiは、次の移行コマンドラインツールを提供します-
- 新しい移行を作成する
- 移行を元に戻す
- 移行を適用する
- 移行を再適用する
- 移行ステータスと履歴を表示する
移行の作成
新しいデータベース移行を作成しましょう。
- ステップ1 *-基本的なアプリケーションテンプレートのプロジェクトルート内で、コンソールウィンドウを開いて実行します。
./yii migrate/create add_news_table
上記のコマンドは、 migrations フォルダーに新しい移行ファイル(この場合はm160113_102634_add_news_table.php)を作成します。
ファイルには次のコードが含まれています-
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
}
public function down() {
echo "m160113_102634_add_news_table cannot be reverted.\n";
return false;
}
/*
//Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
各DB移行は、 yii \ db \ Migration クラスを拡張するPHPクラスです。 クラス名は、次の形式で生成されます-
m<YYMMDD_HHMMSS>_<Name>
ここで、 <YYMMDD_HMMSS> は移行コマンドが実行されたUTC日時で、<Name>はコンソールコマンドで指定した引数です。
データベースをアップグレードするとup()メソッドが呼び出され、データベースをダウングレードするとdown()メソッドが呼び出されます。
- ステップ2 *-新しいテーブルをデータベースに追加するには、この方法で移行ファイルを変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
$this->createTable("news", [
"id" => Schema::TYPE_PK,
"title" => Schema::TYPE_STRING,
"content" => Schema::TYPE_TEXT,
]);
}
public function down() {
$this->dropTable('news');
}
/*
//Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
上記のコードでは、* up()メソッドでnewsという新しいテーブルを作成し、 down()*メソッドでこのテーブルを削除しました。
*news* テーブルは、id、title、およびcontentの3つのフィールドで構成されています。 テーブルまたは列を作成するときは、移行がデータベースの種類に依存しないように、抽象型を使用する必要があります。 たとえば、MySQLの場合、TYPE_PKはint(11)NOT NUL AUTO_INCREMETN PRIMARY KEYに変換されます。
- ステップ3 *-データベースをアップグレードするには、このコマンドを実行します。
./yii migrate
上記のコマンドは、まだ適用されていない利用可能なすべての移行を一覧表示します。 次に、移行の適用を確認すると、すべての新しい移行クラスでsafeUp()またはup()が実行されます。
- ステップ4 *-利用可能な移行を3つだけ適用するには、実行できます。
./yii migrate 3
- ステップ5 *-データベースを移行する特定の移行を定義することもできます。
#タイムスタンプを使用して移行を指定する
yii migrate/to 160202_195501
#strtotime()で解析できる文字列を使用
yii migrate/to "2016-01-01 19:55:01"
#フルネームを使用
yii migrate/to m160202_195501_create_news_table
#UNIXタイムスタンプを使用
yii migrate/to 1393964718
- ステップ6 *-移行を元に戻すには(down()またはsafeDown()メソッドを実行)、実行します。
./yii migrate/down
- ステップ7 *-最も最近適用された5つの移行を元に戻すには、実行できます。
./yii migrate/down 5
- ステップ8 *-移行をやり直す(元に戻してから再度適用する)には、実行します。
./yii migrate/redo
すでに適用された移行を一覧表示するには、これらのコマンドを使用します-
- yii migrate/new #最初の10個の新しい移行を表示
- yii migrate/new 3 #最初の3つの新しい移行を示します
- yii migrate/new all #すべての新しい移行を表示
- yii migrate/history #最後に適用された10個の移行を表示
- yii migrate/history 20 #最後に適用された20個の移行を表示
- yii migrate/history all #適用されたすべての移行を表示
特定のテーブルから列を追加または削除する必要がある場合があります。 * addColumn()および dropColumn()*メソッドを使用できます。
- ステップ1 *-新しい移行を作成します。
./yii migrate/create add_category_to_news
- ステップ2 *-新しく作成した移行ファイルをこの方法で変更します。
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function up() {
$this->addColumn('news', 'category', $this->integer());
}
public function down() {
$this->dropColumn('news', 'category');
}
}
?>
ここで、。/yii migrate *を実行すると、カテゴリテーブルがニューステーブルに追加されます。 逆に、。/yii migrate/down 1 *を実行すると、カテゴリ列は削除されます。
DB移行を実行する場合、各移行が成功または失敗したことを確認することが重要です。 DB操作をトランザクションで囲むことをお勧めします。 トランザクション移行を実装するには、* safeUp()および safeDown()*メソッドに移行コードを配置するだけです。 これらのメソッドのいずれかの操作が失敗すると、以前のすべての操作がロールバックされます。
「トランザクション方式」の前の例は次のようになります-
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function safeUp() {
$this->addColumn('news', 'category', $this->integer());
}
public function safeDown() {
$this->dropColumn('news', 'category');
}
}
?>
*yii \ db \ Migration* クラスは、データベースを操作するための以下のメソッドを提供します-
- * execute()*-生のSQLステートメントを実行します
- * createTable()*-テーブルを作成します
- * renameTable()*-テーブルの名前を変更
- * insert()*-単一の行を挿入します
- * batchInsert()*-複数の行を挿入
- * update()*-行を更新する
- * delete()*-行を削除します
- * addColumn()*-列を追加します
- * renameColumn()*-列の名前を変更します
- * dropColumn()*-列を削除します
- * alterColumn()*-列を変更します
- * dropTable()*-テーブルを削除します
- * truncateTable()*-テーブル内のすべての行を削除します
- * createIndex()*-インデックスを作成します
- * dropIndex()*-インデックスを削除します
- * addPrimaryKey()*-主キーを追加します
- * dropPrimaryKey()*-主キーを削除します
- * addForeignKey()*-外部キーを追加します
- * dropForeignKey()*-外部キーを削除します