Yii數據庫遷移

在開發數據庫驅動應用程序的過程中,源代碼轉成數據庫結構。 Yii提供了數據庫遷移功能,可以讓您跟蹤數據庫更改。

Yii提供以下遷移命令行工具 -

  • 創建新的遷移

  • 恢復遷移

  • 應用遷移

  • 重新申請遷移

  • 顯示遷移狀態和歷史記錄

創建遷移


現在創建一個新的數據庫遷移。

第1步 - 在基本應用程序模板項目根目錄內打開控制檯窗口並運行。

c:>baisc> yii migrate/create add_news_table

上面的命令將在migrations文件夾中創建的新的遷移文件(本示例中生成的是:m160605_040139_add_news_table.php)。

該文件包含下面的代碼 -

每個數據遷移是擴展了 yii\db\Migration 類的PHP類。類名是按以下格式生成的 -

m<YYMMDD_HHMMSS>_

其中<YYMMDD_HMMSS>是指遷移命令被執行的UTC日期時間和是在控制檯命令提供的參數。

 當升級數據庫時 up() 方法被調用,而當降級時 down()方法被調用。

第2步 - 對新表添加到數據庫,使用以下方式來修改 migration 文件。

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

Yii數據庫遷移
第8步- 要重做(恢復,然後重新提交)遷移,運行。

c:\basic> yii migrate/redo

Yii數據庫遷移
要列出已經應用的遷移,可以使用這些命令 -

  • 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 文件並使用以下代碼。

addColumn('news', 'category', $this->integer()); } public function down() { $this->dropColumn('news', 'category'); } } ?>

現在,如果運行 yii migrate,category 字段列應該被添加到 news 表中。

相反,如果運行 yii migrate/down 1 ,category 字段欄應被丟棄(刪除)。

當執行數據庫遷移,重要的是要確保每個遷移成功或失敗。建議在數據庫操作中使用事務處理。要實現事務遷移,需要把遷移代碼放在 safeUp()和 safeDown()方法中。如果這些方法中的任何操作失敗,所有以前的操作將被回滾。

在之前的實例中,使用「事務方式」如下所示:

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() − 刪除一個外鍵