Yii-データベースの移行
データベース駆動型アプリケーションの開発中に、データベース構造はソースコードとともに進化します。Yiiはdatabase migration データベースの変更を追跡できる機能。
Yiiは次の移行コマンドラインツールを提供します-
- 新しい移行を作成する
- 移行を元に戻す
- 移行を適用する
- 移行を再適用する
- 移行ステータスと履歴を表示する
移行の作成
新しいデータベース移行を作成しましょう。
Step 1 −基本アプリケーションテンプレートのプロジェクトルート内で、コンソールウィンドウを開いて実行します。
./yii migrate/create add_news_table
上記のコマンドは、新しい移行ファイル(この場合はm160113_102634_add_news_table.php)を作成します。 migrations フォルダ。
このファイルには次のコードが含まれています-
<?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クラス。クラス名は次の形式で生成されます-
m<YYMMDD_HHMMSS>_<Name>
どこ <YYMMDD_HMMSS> は移行コマンドが実行されたUTC日時であり、<Name>はコンソールコマンドで指定した引数です。
up()メソッドはデータベースをアップグレードするときに呼び出され、down()メソッドはデータベースをダウングレードするときに呼び出されます。
Step 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() {
}
*/
}
?>
上記のコードでは、newsという新しいテーブルを作成しました。 up() メソッドとこのテーブルをにドロップしました down() 方法。
ザ・ newsテーブルは、id、title、contentの3つのフィールドで構成されています。テーブルまたは列を作成するときは、移行がデータベースタイプに依存しないように、抽象タイプを使用する必要があります。たとえば、MySQLの場合、TYPE_PKはint(11)NOT NUL AUTO_INCREMETN PRIMARYKEYに変換されます。
Step 3 −データベースをアップグレードするには、このコマンドを実行します。
./yii migrate
上記のコマンドは、まだ適用されていない利用可能なすべての移行を一覧表示します。次に、移行を適用することを確認すると、すべての新しい移行クラスでsafeUp()またはup()が実行されます。
Step 4 −使用可能な移行を3つだけ適用するには、を実行できます。
./yii migrate 3
Step 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
Step 6 −移行を元に戻すには(down()またはsafeDown()メソッドを実行)、を実行します。
./yii migrate/down
Step 7 −最近適用された5つの移行を元に戻すには、を実行できます。
./yii migrate/down 5
Step 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() メソッド。
Step 1 −新しい移行を作成します。
./yii migrate/create add_category_to_news
Step 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() −外部キーを削除します