Yii - 資料庫遷移



在開發資料庫驅動的應用程式期間,資料庫結構會隨著原始碼一起發展。Yii 提供了**資料庫遷移**功能,允許您跟蹤資料庫的變化。

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() {
   
      }
      */
   }
?>

每個資料庫遷移都是一個擴充套件**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。在建立表或列時,我們應該使用抽象型別,以便遷移獨立於資料庫型別。例如,在 MySQL 的情況下,TYPE_PK 將轉換為 int(11) NOT NUL AUTO_INCREMETN PRIMARY KEY。

**步驟 3** - 要升級資料庫,請執行此命令。

./yii migrate

Upgrade Database

以上命令將列出所有尚未應用的可用遷移。然後,如果您確認應用遷移,它將在所有新的遷移類中執行 safeUp() 或 up()。

**步驟 4** - 要僅應用三個可用的遷移,您可以執行。

./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

Revert Migration

**步驟 7** - 要回滾最近應用的五個遷移,您可以執行。

./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**,則 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() - 刪除外部索引鍵

廣告