
- Yii 教程
- Yii - 首頁
- Yii - 概述
- Yii - 安裝
- Yii - 建立頁面
- Yii - 應用程式結構
- Yii - 入口指令碼
- Yii - 控制器
- Yii - 使用控制器
- Yii - 使用操作
- Yii - 模型
- Yii - 小部件
- Yii - 模組
- Yii - 檢視
- Yii - 佈局
- Yii - 資源
- Yii - 資源轉換
- Yii - 擴充套件
- Yii - 建立擴充套件
- Yii - HTTP 請求
- Yii - 響應
- Yii - URL 格式
- Yii - URL 路由
- Yii - URL 規則
- Yii - HTML 表單
- Yii - 驗證
- Yii - 特設驗證
- Yii - AJAX 驗證
- Yii - 會話
- Yii - 使用快閃記憶體資料
- Yii - Cookie
- Yii - 使用 Cookie
- Yii - 檔案上傳
- Yii - 格式化
- Yii - 分頁
- Yii - 排序
- Yii - 屬性
- Yii - 資料提供程式
- Yii - 資料小部件
- Yii - ListView 小部件
- Yii - GridView 小部件
- Yii - 事件
- Yii - 建立事件
- Yii - 行為
- Yii - 建立行為
- Yii - 配置
- Yii - 依賴注入
- Yii - 資料庫訪問
- Yii - 資料訪問物件
- Yii - 查詢生成器
- Yii - Active Record
- Yii - 資料庫遷移
- Yii - 主題
- Yii - RESTful API
- Yii - RESTful API 實踐
- Yii - 欄位
- Yii - 測試
- Yii - 快取
- Yii - 片段快取
- Yii - 別名
- Yii - 日誌記錄
- Yii - 錯誤處理
- Yii - 身份驗證
- Yii - 授權
- Yii - 本地化
- Yii - Gii
- Gii – 建立模型
- Gii – 生成控制器
- Gii – 生成模組
- Yii 有用資源
- Yii - 快速指南
- Yii - 有用資源
- Yii - 討論
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

以上命令將列出所有尚未應用的可用遷移。然後,如果您確認應用遷移,它將在所有新的遷移類中執行 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

**步驟 7** - 要回滾最近應用的五個遷移,您可以執行。
./yii migrate/down 5
**步驟 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()**方法。
**步驟 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() - 刪除外部索引鍵