Yii資料庫遷移


在開發資料庫驅動應用程式的過程中,原始碼轉成資料庫結構。 Yii提供了資料庫遷移功能,可以讓您跟蹤資料庫更改。
Yii提供以下遷移命令列工具 -
  • 建立新的遷移
  • 恢復遷移
  • 應用遷移
  • 重新申請遷移
  • 顯示遷移狀態和歷史記錄

建立遷移

現在建立一個新的資料庫遷移。
第1步 - 在基本應用程式模板專案根目錄內開啟控制台視窗並執行。
c:>baisc> yii migrate/create add_news_table
上面的命令將在migrations檔案夾中建立的新的遷移檔案(本範例中生成的是:m160605_040139_add_news_table.php)。
該檔案包含下面的程式碼 -
<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160605_040139_add_news_table extends Migration { public function up() {
   
      }
      public function down() {
         echo "m160605_040139_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() {
   
      }
      */
   }
?>
每個資料遷移是擴充套件了 yii\db\Migration 類的PHP類。類名是按以下格式生成的 -
m<YYMMDD_HHMMSS>_<Name>
其中<YYMMDD_HMMSS>是指遷移命令被執行的UTC日期時間和<Name>是在控制台命令提供的引數。
 當升級資料庫時 up() 方法被呼叫,而當降級時 down()方法被呼叫。
第2步 - 對新表新增到資料庫,使用以下方式來修改 migration 檔案。
<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160605_040139_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 。 當建立一個表或列,我們應該用抽象型別以便遷移時它轉為資料庫的型別。例如,在 MySQL 中,TYPE_PK將被轉換成 int(11) NOT NUL AUTO_INCREMETN PRIMARY KEY。
第3步 - 升級資料庫,執行此命令。
c:\>basic> yii migrate
Yii數據庫遷移
上面的命令將列出尚未提交過的所有可用的應用遷移。然後,如果確認提交遷移,它將在所有新的 migration 類中執行 safeUp()或 up()。
第4步 - 只有三個可用的遷移可以提交執行。
c:\>basic> yii migrate 3
第5步 - 也可以定義一個特定遷移將資料庫遷移。

# 使用時間戳來指定遷移

c:\>basic> yii migrate/to 160606_105608

# 使用能夠通過 strtotime() 來解析的字串。

c:\>basic> yii migrate/to "2016-06-06 19:35:21"

# 使用全名

c:>basic> yii migrate/to m160606_193521_create_news_table

# 使用 UNIX timestamp

c:\basic> yii migrate/to 1399964718
第6步 - 要恢復遷移(執行 down() 或safeDown()方法)並執行。
c:\basic> yii migrate/down
第7步 - 只能最多恢復5個最近使用的應用的遷移,可以執行以下命令:
c:\>basic> yii migrate/down 5

第8步- 要重做(恢復,然後重新提交)遷移,執行。
c:\basic> 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步 - 建立一個新的遷移。
c:\>basic> yii migrate/create add_category_to_news
第2步 - 修改新建立的 migration 檔案並使用以下程式碼。
<?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,category 欄位列應該被新增到 news 表中。
相反,如果執行 yii migrate/down 1 ,category 欄位欄應被丟棄(刪除)。

當執行資料庫遷移,重要的是要確保每個遷移成功或失敗。建議在資料庫操作中使用事務處理。要實現事務遷移,需要把遷移程式碼放在 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() ? 刪除一個外來鍵