目錄
1. 創建遷移
2. 事務遷移
3.使用遷移
4. 恢复迁移
5. 重做迁移
6. 显示迁移信息
7. 编辑迁移历史
8. 自定义迁移命令
首頁 後端開發 php教程 Yii框架官方指南系列增補版27-使用資料庫:資料庫遷移

Yii框架官方指南系列增補版27-使用資料庫:資料庫遷移

Feb 15, 2017 am 09:10 AM



注意: yii從版本1.1.6以後才開始支援資料庫遷移特性。

和原始碼一樣,資料庫的結構也隨著我們開發和維護資料庫驅動應用程式而不斷壯大.例如,在開發期間,我們可能想要新增一個新的表; 或者在應用投入生產期以後,我們可能會意識到需要在某個列上添加索引. 追蹤這些資料庫結構的改變(被稱作遷移)和操作原始碼一樣很重要.如果原始碼和資料庫不同步了,可能這個系統都會中斷。正是因為這個原因,Yii框架提供了資料庫遷移工具,以便追蹤資料庫遷移歷史,應用新的遷移,或恢復舊的遷移.

下面的步驟顯示瞭如何在開發期間使用資料庫遷移:
Tim添加一個新的遷移(e.g. create a new table)
Tim提交一個新的遷移到版本控制工具(e.g. SVN, GIT)
Doug 從版本控制工具更新並取出一個新的遷移
Doug 應用新的遷移到本地開發版本的資料庫

Yii框架透過yiic migrate命令列工具支援資料庫遷移. 這個工具支援建立新的遷移,應用程式/復原/取消遷移,並且顯示遷移歷史和新的遷移。

接下來,我們將會描述如何使用這個工具。

注意: 當使用命令列遷移工具進行遷移時最好使用application目錄下的yiic (e.g. cd path/to/protected)而不是系統目錄下的. 確保擁有protectedmigrations 資料夾並且它是可寫的. 還若要檢查在protected/config/console.php中是否配置了資料庫連線。

1. 創建遷移

想要創建一個新的遷移(例如創建一個news表), 我們可以運行如下命令:

yiic migrate create <name>
登入後複製

參數name是必須的,指定了關於這個遷移的非常簡短的描述(e.g. create_news_table). 正如我們在下面要展示的, name參數是PHP類別名稱的一部分。並且它只能包含字母,數字和下劃線。

yiic migrate create create_news_table
登入後複製

上面的命令將會在路徑protected/migrations下建立一個新的名為m101129_185401_create_news_table.php的文件,該文件包含了下列程式碼:

class m101129_185401_create_news_table extends CDbMigration
{
    public function up(){}

    public function down()
    {
        echo "m101129_185401_create_news_table does not support migration down.\n";
        return false;
    }

    /*
    // implement safeUp/safeDown instead if transaction is needed
    public function safeUp(){}

    public function safeDown(){}
    */
}
登入後複製

注意這個類別名稱和檔案名稱一樣,都是m _模式,其中表示遷移建立時的UTC時間戳 (格式為yymmdd_hhmmss) , 而 是從指令的命名參數中取得的。

up() 方法應該包含實作資料庫遷移的程式碼, 而down() 方法包含的程式碼則用於還原up()方法中的操作。

有時候, 實作down()中的操作是不可能的。例如, 如果在up()方法中刪除表格的某一行, 就不能在down方法中恢復。 在這種情況下, 遷移被稱作不可逆的,這意味著我們不能回滾到資料庫的前一個狀態。 在上面產生的程式碼中, down() 方法傳回false來表示遷移的不可逆

Info: 從版本1.1.7開始, 如果up() 或down() 方法回傳false, 下面的所有遷移都會被取消。而在版本1.1.6中, 必須拋出異常來取消下面的遷移。

讓我們用一個例子來展示建立一個news表的遷移.

class m101129_185401_create_news_table extends CDbMigration
{
    public function up()
    {
        $this->createTable('tbl_news', array(
            'id' => 'pk',
            'title' => 'string NOT NULL',
            'content' => 'text',
        ));
    }

    public function down()
    {
        $this->dropTable('tbl_news');
    }
}
登入後複製

基類CDbMigration 提供了一系列的方法來操作資料和資料庫,例如, CDbMigration::createTable 會創將資料庫表,CDbMigration::insert會插入一行資料。這些方法都使用CDbMigration::getDbConnection()傳回的資料庫連線, 預設是Yii::app()->db。

Info: 你可能注意到CDbMigration提供的資料庫方法和CDbCommand中的很類似。的確,它們基本上相同,除了CDbMigration方法會計算執行所耗的時間以及列印一些方法參數的資訊。

也可以擴展操作資料庫的方法,例如:

public function up()
{
    $sql = "CREATE TABLE IF NOT EXISTS user(
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(32) NOT NULL,
        password VARCHAR(32) NOT NULL,
        email VARCHAR(32) NOT NULL
    ) ENGINE=MyISAM";
    $this->createTableBySql('user',$sql);
}
public function createTableBySql($table,$sql){
    echo " > create table $table ...";
    $time=microtime(true);
    $this->getDbConnection()->createCommand($sql)->execute();
    echo " done (time: ".sprintf('%.3f', microtime(true)-$time)."s)\n";
}
登入後複製

2. 事務遷移

Info: 事務遷移的特性從版本1.1.7起開始支援.

在複雜的資料庫遷移中, 我們經常想要確保每一個遷移都是成功的還是失敗的,以便資料庫保持一致性和完整性。 為了實現這個目標我們可以利用資料庫事務.

我們可以明確地開啟資料庫事務並附上其他資料庫相關的包含事務的程式碼,例如:

class m101129_185401_create_news_table extends CDbMigration
{
    public function up()
    {
        $transaction=$this->getDbConnection()->beginTransaction();
        try
        {
            $this->createTable('tbl_news', array(
                'id' => 'pk',
                'title' => 'string NOT NULL',
                'content' => 'text',
            ));
            $transaction->commit();
        }catch(Exception $e){
            echo "Exception: ".$e->getMessage()."\n";
            $transaction->rollback();
            return false;
        }
    }

    // ...similar code for down()
}
登入後複製

然而, 一個更簡單的獲取事務支援的方法是實作safeUp () 方法來取代up(), 以及safeDown() 來取代down(). 例如:

class m101129_185401_create_news_table extends CDbMigration
{
    public function safeUp()
    {
        $this->createTable('tbl_news', array(
            'id' => 'pk',
            'title' => 'string NOT NULL',
            'content' => 'text',
        ));
    }

    public function safeDown()
    {
        $this->dropTable('tbl_news');
    }
}
登入後複製

當Yii執行遷移的時候, 將會開啟資料庫遷移然後呼叫safeUp() 或safeDown(). 如果safeUp()和safeDown()出現任何錯誤, 事務將會回滾, 以確保資料庫保持一致性和完整性.

Note: 不是所有的DBMS都支援事務. 並且一些DB查詢不能放到事務中. 在這種情況下, 你比許實現up()和down()取而代之. 對MySQL而言, 一些SQL語句會引發衝突.

3.使用遷移

想要使用所有有效的新遷移(i.e., make the local database up-to-date), 執行下面的指令:

yiic migrate
登入後複製

这个命令会显示所有新迁移的列表. 如果你确定使用迁移, 它将会在每一个新的迁移类中运行up()方法, 一个接着一个, 按照类名中的时间戳的顺序.

在使用迁移之后, 迁移工具会在一个数据表tbl_migration中写一条记录——允许工具识别应用了哪一个迁移. 如果tbl_migration表不存在 ,工具会在配置文件中db指定的数据库中自动创建。

有时候, 我们可能指向应用一条或者几条迁移. 那么可以运行如下命令:

yiic migrate up 3
登入後複製

这个命令会运行3个新的迁移. 该表value的值3将允许我们改变将要被应用的迁移的数目。

我们还可以通过如下命令迁移数据库到一个指定的版本:

yiic migrate to 101129_185401
登入後複製

也就是我们使用数据库迁移名中的时间戳部分来指定我们想要迁移到的数据库的版本。如果在最后应用的数据库迁移和指定的迁移之间有多个迁移, 所有这些迁移都会被应用. 如果指定迁移已经使用过了, 所有之后应用的迁移都会恢复。

4. 恢复迁移

想要恢复最后一个或几个已应用的迁移,我们可以运行如下命令:

yiic migrate down [step]
登入後複製

其中选项 step 参数指定了要恢复的迁移的数目. 默认是1, 意味着恢复最后一个应用的迁移.

正如我们之前所描述的, 不是所有的迁移都能恢复. 尝试恢复这种迁移会抛出异常并停止整个恢复进程。

5. 重做迁移

重做迁移意味着第一次恢复并且之后应用指定的迁移. 这个可以通过如下命令来实现:

yiic migrate redo [step]
登入後複製

其中可选的step参数指定了重做多少个迁移 . 默认是1, 意味着重做最后一个迁移.

6. 显示迁移信息

除了应用和恢复迁移之外, 迁移工具还可以显示迁移历史和被应用的新迁移。

yiic migrate history [limit]
yiic migrate new [limit]
登入後複製

其中可选的参数 limit 指定克显示的迁移的数目。如果limit没有被指定,所有的有效迁移都会被显示。

第一个命令显示已经被应用的迁移, 而第二个命令显示还没被应用的迁移。

7. 编辑迁移历史

有时候, 我们可能想要在没有应用和恢复相应迁移的时候编辑迁移历史来指定迁移版本. 这通常发生在开发一个新的迁移的时候. 我们使用下面的命令来实现这一目标.

yiic migrate mark 101129_185401
登入後複製

这个命令和yiic migrate to命令非常类似, 但它仅仅只是编辑迁移历史表到指定版本而没有应用或者恢复迁移。

8. 自定义迁移命令

有多种方式来自定义迁移命令。

使用命令行选项

迁移命令需要在命令行中指定四个选项:

interactive: boolean, specifies whether to perform migrations in an interactive mode. Defaults to true, meaning the user will be prompted when performing a 
specific migration. You may set this to false should the migrations be done in a background process.

migrationPath: string, specifies the directory storing all migration class files. This must be specified in terms of a path alias, and the corresponding 
directory must exist. If not specified, it will use the migrations sub-directory under the application base path.

migrationTable: string, specifies the name of the database table for storing migration history information. It defaults to tbl_migration. The table 
structure is version varchar(255) primary key, apply_time integer.

connectionID: string, specifies the ID of the database application component. Defaults to 'db'.

templateFile: string, specifies the path of the file to be served as the code template for generating the migration classes. This must be specified in terms of a 
path alias (e.g. application.migrations.template). If not set, an internal template will be used. Inside the template, the token {ClassName} will be replaced 
with the actual migration class name.
登入後複製

想要指定这些选项, 使用如下格式的迁移命令执行即可:

yiic migrate up --option1=value1 --option2=value2 ...
登入後複製

例如, 如果我们想要迁移一个论坛模块,它的迁移文件都放在模块的迁移文件夹中,可以使用如下命令:

yiic migrate up --migrationPath=ext.forum.migrations
登入後複製

注意在你设置布尔选项如interactive的时候,使用如下方式传入1或者0到命令行:

yiic migrate --interactive=0
登入後複製

配置全局命令

命令行选项允许我们快速配置迁移命令, 但有时候我们可能想要只配置一次命令. 例如, 我们可能想要使用不同的表来保存迁移历史, 或者我们想要使用自定义的迁移模板。我们可以通过编辑控制台应用的配置文件来实现,如下所示:

return array(
    ......
    'commandMap'=>array(
        'migrate'=>array(
            'class'=>'system.cli.commands.MigrateCommand',
            'migrationPath'=>'application.migrations',
            'migrationTable'=>'tbl_migration',
            'connectionID'=>'db',
            'templateFile'=>'application.migrations.template',
        ),
        ......
    ),
    ......
);
登入後複製

现在如果我们运行迁移命令,上述配置将会生效,而不需要我们每一次在命令行中都输入那么多选项信息。

以上就是Yii框架官方指南系列增补版27——使用数据库:数据库迁移的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
Yii框架中間件:為應用程式提供多重資料儲存支持 Yii框架中間件:為應用程式提供多重資料儲存支持 Jul 28, 2023 pm 12:43 PM

Yii框架中間件:為應用程式提供多重資料儲存支援介紹中間件(middleware)是Yii框架中的重要概念,它為應用程式提供了多重資料儲存支援。中間件的作用類似於一個過濾器,它能夠在應用程式的請求和回應之間插入自訂程式碼。透過中間件,我們可以對請求進行處理、驗證、過濾,然後將處理後的結果傳遞給下一個中間件或最終的處理程序。 Yii框架中的中間件使用起來非常

使用Zend框架實現資料庫遷移(Migrations)的步驟 使用Zend框架實現資料庫遷移(Migrations)的步驟 Jul 28, 2023 pm 05:54 PM

使用Zend框架實現資料庫遷移(Migrations)的步驟引言:資料庫遷移是軟體開發過程中不可或缺的一部分,它的作用是為了方便團隊在開發中對資料庫結構的修改和版本控制。而Zend框架提供了一套強大的資料庫遷移工具,可以幫助我們輕鬆管理資料庫結構的變動。本文將介紹如何使用Zend框架實作資料庫遷移的步驟,並附上對應的程式碼範例。步驟1:安裝Zend框架首先

Yii框架中間件:為應用程式新增日誌記錄和偵錯功能 Yii框架中間件:為應用程式新增日誌記錄和偵錯功能 Jul 28, 2023 pm 08:49 PM

Yii框架中間件:為應用程式新增日誌記錄和偵錯功能【引言】在開發Web應用程式時,我們通常需要添加一些附加功能以提高應用程式的效能和穩定性。 Yii框架提供了中間件的概念,使我們能夠在應用程式處理請求之前和之後執行一些額外的任務。本文將介紹如何使用Yii框架的中間件功能來實作日誌記錄和除錯功能。 【什麼是中間件】中間件是指在應用程式處理請求之前和之後,對請求和回應做

PHP中如何使用Yii框架 PHP中如何使用Yii框架 Jun 27, 2023 pm 07:00 PM

隨著Web應用程式的快速發展,現代Web開發已成為一項重要技能。許多框架和工具可用於開發高效的Web應用程序,其中Yii框架就是一個非常流行的框架。 Yii是一個高效能、基於元件的PHP框架,它採用了最新的設計模式和技術,提供了強大的工具和元件,是建立複雜Web應用程式的理想選擇。在本文中,我們將討論如何使用Yii框架來建立Web應用程式。安裝Yii框架首先,

使用Yii框架實現網頁快取和頁面分塊的步驟 使用Yii框架實現網頁快取和頁面分塊的步驟 Jul 30, 2023 am 09:22 AM

使用Yii框架實現網頁快取和頁面分塊的步驟引言:在Web開發過程中,為了提升網站的效能和使用者體驗,常常需要對頁面進行快取和分塊處理。 Yii框架提供了強大的快取和佈局功能,可以幫助開發者快速實現網頁快取和頁面分塊,本文將介紹如何使用Yii框架進行網頁快取和頁面分塊的實作。一、網頁快取開啟網頁快取在Yii框架中,可以透過設定檔來開啟網頁快取。開啟主設定檔co

PHP和SQLite:如何進行資料庫遷移和升級 PHP和SQLite:如何進行資料庫遷移和升級 Jul 28, 2023 pm 08:10 PM

PHP和SQLite:如何進行資料庫遷移和升級在開發Web應用程式時,資料庫遷移和升級是一個很常見的任務。而對於使用PHP和SQLite的開發者來說,這個過程可能會比較複雜。本文將介紹如何使用PHP和SQLite進行資料庫遷移和升級,並提供一些程式碼範例供參考。建立SQLite資料庫首先,我們需要建立一個SQLite資料庫。使用SQLite資料庫非常方便,我們

在Yii框架中使用控制器(Controllers)處理Ajax請求的方法 在Yii框架中使用控制器(Controllers)處理Ajax請求的方法 Jul 28, 2023 pm 07:37 PM

在Yii框架中,控制器(Controllers)扮演著處理請求的重要角色。除了處理常規的頁面請求之外,控制器還可以用於處理Ajax請求。本文將介紹在Yii框架中處理Ajax請求的方法,並提供程式碼範例。在Yii框架中,處理Ajax請求可以透過以下步驟進行:第一步,建立一個控制器(Controller)類別。可以透過繼承Yii框架提供的基礎控制器類別yiiwebCo

Yii框架中的調試工具:分析和調試應用程式 Yii框架中的調試工具:分析和調試應用程式 Jun 21, 2023 pm 06:18 PM

在現代的Web應用程式開發中,調試工具是不可或缺的。它們可以幫助開發者找到和解決應用程式的各種問題。 Yii框架作為一款流行的Web應用程式框架,自然也提供了一些除錯工具。本文將重點介紹Yii框架中的調試工具,並討論它們如何幫助我們分析和調試應用程式。 GiiGii是Yii框架的程式碼產生器。它可以自動產生Yii應用程式的程式碼,如模型、控制器和視圖等。使用Gii,

See all articles