Yii-database-migration

提供:Dev Guides
移動先:案内検索

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

Redo Migration

すでに適用された移行を一覧表示するには、これらのコマンドを使用します-

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