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() −外部キーを削除します