国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Yii 的修行之路 - Migration 數據遷移

noONE / 1300人閱讀

摘要:把所有的增量數據庫遷移提交到生產環境數據庫當中。如果其中任意一個遷移提交失敗了,那么這條命令將會退出并停止剩下的那些還未執行的遷移。執行這條命令期間不會有任何的遷移會被提交或還原。

簡述

數據遷移就是數據庫表在團隊建的遷移操作,達到團隊相互間的信息同步,數據統一。

數據庫遷移

一般步驟:

1、在 yii2 的 migrate 中,通常用來對數據庫數據表進行修改操作,主要對結構和小部分數據進行操作(很少會遇到大數據,如果是面對數據量比較大的情況,采用數據表的直接導出導入)。

2、本地生成或修改數據庫表,后端執行語句: ./yii migrate/create

3、后端執行 migrate 指令后會生成一個 migrate 腳本,這個腳本里面主要用來存放 SQL語句,也會隨著代碼發布而上傳,以供其他成員同步數據庫,實現真正的數據遷移。

4、其他成員拉去最新代碼回本地后,執行 ./yii migrate 更新數據遷移狀態,把最新的數據遷移同步到本地。

概念

在開發和維護一個數據庫驅動的應用程序時,數據庫的結構會隨代碼的改變而改變。

例如,在開發應用程序的過程中,會增加一張新表且必須得加進來; 在應用程序被部署到生產環境后,需要建立一個索引來提高查詢的性能等等。 因為一個數據庫結構發生改變的時候源代碼也經常會需要做出改變,Yii 提供了一個 數據庫遷移 功能,該功能可以記錄數據庫的變化, 以便使數據庫和源代碼一起受版本控制。

如下的步驟向我們展示了數據庫遷移工具是如何為開發團隊所使用的:

Tim 創建了一個新的遷移對象(例如,創建一張新的表單,改變字段的定義等)。

Tim 將這個新的遷移對象提交到代碼管理系統(例如,Git,Mercurial)。

Doug 從代碼管理系統當中更新版本并獲取到這個新的遷移對象。

Doug 把這個遷移對象提交到本地的開發數據庫當中,這樣一來,Doug 同步了 Tim 所做的修改。

如下的步驟向我們展示了如何發布一個附帶數據庫遷移的新版本到生產環境當中:

Scott 為一個包含數據庫遷移的項目版本創建了一個發布標簽。

Scott 把發布標簽的源代碼更新到生產環境的服務器上。

Scott 把所有的增量數據庫遷移提交到生產環境數據庫當中。

Yii 提供了一整套的遷移命令行工具,通過這些工具你可以:

創建新的遷移(./yii migrate/create 遷移描述);

提交遷移;

恢復遷移;

重新提交遷移;

現實遷移歷史和狀態。

所有的這些工具都可以通過 yii migrate 命令來進行操作。
注意:遷移不僅僅只作用于數據庫表,它同樣會調整現有的數據來適應新的表單、創建 RBAC 分層、又或者是清除緩存。

創建遷移

使用如下命令來創建一個新的遷移:

yii migrate/create 

必填參數 name 的作用是對新的遷移做一個簡要的描述。

例如,如果這個遷移是用來創建一個叫做 news 的表單的,那么你可以使用create_news_table 這個名稱并運行如下命令:

yii migrate/create create_news_table

注意:因為 name 參數會被用來生成遷移的類名的一部分,所以該參數應當只包含字母、數字和下劃線。

如上命令將會在 @app/migrations 目錄下創建一個新的名為 m150101_185401_create_news_table.php 的 PHP 類文件。

該文件包含如下的代碼,它們用來聲明一個遷移類 m150101_185401_create_news_table,并附有代碼框架:


每個數據庫遷移都會被定義為一個繼承自 yiidbMigration 的 PHP 類。類的名稱按照 m_ 的格式自動生成,其中

指執行創建遷移命令的 UTC 時間。

和你執行命令時所帶的 name 參數值相同。

在遷移類當中,你應當在 up() 方法中編寫改變數據庫結構的代碼。你可能還需要在 down() 方法中編寫代碼來恢復由 up() 方法所做的改變。

當你通過 migration 升級數據庫時, up() 方法將會被調用,反之, down() 將會被調用。如下代碼展示了如何通過遷移類來創建一張 news 表:

use yiidbSchema; 
use yiidbMigration; 
class m150101_185401_create_news_table extends yiidbMigration{ 
    public function up() { 
        $this->createTable("news", [ "id" => Schema::TYPE_PK, "title" => Schema::TYPE_STRING . " NOT NULL", "content" => Schema::TYPE_TEXT, ]); 
    } 
    public function down() { 
        $this->dropTable("news"); 
    } 
}

注意:并不是所有遷移都是可恢復的。

例如,如果 up() 方法刪除了表中的一行數據,這將無法通過 down() 方法來恢復這條數據。有時候,你也許只是懶得去執行 down() 方法了,因為它在恢復數據庫遷移方面并不是那么的通用。在這種情況下,你應當在 down() 方法中返回 false 來表明這個 migration 是無法恢復的。

提交遷移

為了將數據庫升級到最新的結構,你應該使用如下命令來提交所有新的遷移:

yii migrate

這條命令會列出迄今為止所有未提交的遷移。

如果你確定你需要提交這些遷移,它將會按照類名當中的時間戳的順序,一個接著一個的運行每個新的遷移類里面的 up() 或者是 safeUp() 方法。如果其中任意一個遷移提交失敗了,那么這條命令將會退出并停止剩下的那些還未執行的遷移。

對于每一個成功提交的遷移,這條命令都會在一個叫做 migration 的數據庫表中插入一條包含應用程序成功提交遷移的記錄,該記錄將幫助遷移工具判斷哪些遷移已經提交, 哪些還沒有提交。

提示:遷移工具將會自動在數據庫當中創建 migration 表,該數據庫是在該命令的 yiiconsolecontrollersMigrateController::db 選項當中指定的。默認情況下,是由 db application component 指定的。

有時,你可能只需要提交一個或者少數的幾個遷移,你可以使用該命令指定需要執行的條數,而不是執行所有的可用遷移。例如,如下命令將會嘗試提交前三個可用的遷移:

yii migrate 3

你也可以指定一個特定的遷移,按照如下格式使用 migrate/to 命令來指定數據庫應該提交哪一個遷移:

yii migrate/to 150101_185401 # using timestamp to specify the migration 使用時間戳來指定遷移 
yii migrate/to "2015-01-01 18:54:01" # using a string that can be parsed by strtotime() 使用一個可以被 strtotime() 解析的字符串 
yii migrate/to m150101_185401_create_news_table # using full name 使用全名 
yii migrate/to 1392853618 # using UNIX timestamp 使用 UNIX 時間戳

如果在指定要提交的遷移前面還有未提交的遷移,那么在執行這個被指定的遷移之前,這些還未提交的遷移會先被提交。

如果被指定提交的遷移在之前已經被提交過,那么在其之后的那些遷移將會被還原。

還原遷移

你可以使用如下命令來還原其中一個或多個意見被提交過的遷移:

yii migrate/down # revert the most recently applied migration 還原最近一次提交的遷移 
yii migrate/down 3 # revert the most 3 recently applied migrations 還原最近三次提交的遷移

注意:并不是所有的遷移都能被還原。嘗試還原這類遷移將可能導致報錯甚至是終止所有的還原進程。

重做遷移

重做遷移的意思是先還原指定的遷移,然后再次提交。如下所示:

yii migrate/redo # redo the last applied migration 重做最近一次提交的遷移 
yii migrate/redo 3 # redo the last 3 applied migrations 重做最近三次提交的遷移

注意:如果一個遷移是不能被還原的,那么你將無法對它進行重做。

列出遷移

你可以使用如下命令列出那些提交了的或者是還未提交的遷移:

yii migrate/history # 顯示最近10次提交的遷移 
yii migrate/history 5 # 顯示最近5次提交的遷移 
yii migrate/history all # 顯示所有已經提交過的遷移 
yii migrate/new # 顯示前10個還未提交的遷移 
yii migrate/new 5 # 顯示前5個還未提交的遷移 
yii migrate/new all # 顯示所有還未提交的遷移
修改遷移歷史

有時候你也許需要簡單的標記一下你的數據庫已經升級到一個特定的遷移,而不是實際提交或者是還原遷移。這個經常會發生在你手動的改變數據庫的一個特定狀態,而又不想相應的遷移被重復提交。那么你可以使用如下命令來達到目的:

yii migrate/mark 150101_185401 # 使用時間戳來指定遷移 
yii migrate/mark "2015-01-01 18:54:01" # 使用一個可以被 strtotime() 解析的字符串 
yii migrate/mark m150101_185401_create_news_table # 使用全名 
yii migrate/mark 1392853618 # 使用 UNIX 時間戳

該命令將會添加或者刪除 migration 表當中的某幾行數據來表明數據庫已經提交到了指定的某個遷移上。

執行這條命令期間不會有任何的遷移會被提交或還原。

全局配置命令

在運行遷移命令的時候每次都要重復的輸入一些同樣的參數會很煩人,這時候,你可以選擇在應用程序配置當中進行全局配置,一勞永逸:

return [
    "controllerMap" => [
        "migrate" => [
            "class" => "yiiconsolecontrollersMigrateController",
            "migrationTable" => "backend_migration",
        ],
    ],
];

如上所示配置,在每次運行遷移命令的時候,backend_migration 表將會被用來記錄遷移歷史。你再也不需要通過migrationTable 命令行參數來指定這張歷史紀錄表了。

遷移多個數據庫

默認情況下,遷移將會提交到由 db application component 所定義的同一個數據庫當中。如果你需要提交到不同的數據庫,你可以像下面那樣指定 db 命令行選項,

yii migrate --db=db2

上面的命令將會把遷移提交到 db2 數據庫當中。

偶爾有限時候你需要提交 一些 遷移到一個數據庫,而另外一些則提交到另一個數據庫。為了達到這個目的,你應該在實現一個遷移類的時候指定需要用到的數據庫組件的 ID , 如下所示:

use yiidbSchema;
use yiidbMigration;

class m150101_185401_create_news_table extends Migration{
    public function init()
    {
        $this->db = "db2";
        parent::init();
    }
}

即使你使用 db 命令行選項指定了另外一個不同的數據庫,上面的遷移還是會被提交到 db2 當中。需要注意的是這個時候遷移的歷史信息依然會被記錄到 db 命令行選項所指定的數據庫當中。

如果有多個遷移都使用到了同一個數據庫,那么建議你創建一個遷移的基類,里面包含上述的 init() 代碼。然后每個遷移類都繼承這個基類就可以了。

提示:除了在 yiidbMigration::db 參數當中進行設置以外,你還可以通過在遷移類中創建新的數據庫連接來操作不同的數據庫。然后通過這些連接再使用 DAO 方法 來操作不同的數據庫。

另外一個可以讓你遷移多個數據庫的策略是把遷移存放到不同的目錄下,然后你可以通過如下命令分別對不同的數據庫進行遷移:

yii migrate --migrationPath=@app/migrations/db1 --db=db1
yii migrate --migrationPath=@app/migrations/db2 --db=db2
...

第一條命令將會把 @app/migrations/db1 目錄下的遷移提交到 db1 數據庫當中,第二條命令則會把 @app/migrations/db2 下的遷移提交到 db2 數據庫當中,以此類推。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21610.html

相關文章

  • Yii 修行之路 - Console 控制臺命令

    摘要:它由一個或多個類組成,它們在控制臺環境下通常被稱為命令。控制臺入口腳本通常被稱為,位于應用程序的根目錄。選項通過覆蓋在中的方法,你可以指定可用于控制臺命令選項。參數將傳遞給請求的子命令對應的操作方法。通常,執行成功的命令會返回。 簡述 控制臺應用程序的結構非常類似于 Yii 的一個 Web 應用程序,主要用于終端服務器執行。 控制臺命令 控制臺應用程序的結構非常類似于 Yii 的一個 ...

    everfly 評論0 收藏0
  • Yii修行之路 - Extension 擴展

    摘要:運行來安裝指定的擴展。這更便于用戶辨別是否是的擴展。當用戶運行安裝一個擴展時,文件會被自動更新使之包含新擴展的信息。上述代碼表明該擴展依賴于包。例如,上述的條目聲明將對應于別名。為達到這個目的,你應當在公開發布前做測試。 簡述 擴展是專門設計的在 Yii 應用中隨時可拿來使用的, 并可重發布的軟件包。 基礎 例如, yiisoft/yii2-debug 擴展在你的應用的每個頁面底部添加...

    bovenson 評論0 收藏0
  • Yii 修行之路 - Gii 代碼生成器

    摘要:簡述是一個強大的代碼生成器,主要用于后臺代碼生成。下面列出由生成的文件,以便你研習功能和實現,或修改它們控制器模型和視圖補充被設計成高度可定制和可擴展的代碼生成工具。使用生成代碼是一個基于界面的代碼生成工具。 簡述 Gii 是一個強大的代碼生成器,主要用于后臺代碼生成。 開始 Gii Gii 是 Yii 中的一個模塊。可以通過配置應用的 yiibaseApplication::modu...

    fuchenxuan 評論0 收藏0
  • Yii修行之路 - Security 安全

    摘要:認證事件類在登錄和注銷流程引發一些事件。成功注銷后引發。提供兩種授權方法存取控制過濾器和基于角色的存取控制。允許已認證用戶執行操作。指定一個回調函數用于判定該規則是否滿足條件。 簡述 在程序開發過程中,往往都不能忽視安全問題,無論你的框架有多么完美,都會有破綻,所以完善自己的系統,從程序開發的安全角度去思考問題,把一切潛在的危機扼殺在搖籃中。 認證(Authentication) 認證...

    AaronYuan 評論0 收藏0
  • Yii 修行之路 - Errors(錯誤處理) & Logging(日志記錄)

    摘要:簡述這里簡單歸納總結關于的錯誤處理和日志記錄的操作。錯誤處理器會正確地設置響應的狀態碼并使用合適的錯誤視圖頁面來顯示錯誤信息。記錄一個警告消息用來指示一些已經發生的意外。的義務是正確處理日志消息。相應的消息通過被記錄。 簡述 這里簡單歸納總結關于Yii的錯誤處理和日志記錄的操作。 錯誤處理(Errors) Yii 內置了一個yiiwebErrorHandler錯誤處理器,它使錯誤處理更...

    _ang 評論0 收藏0

發表評論

0條評論

noONE

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<