摘要:把所有的增量數(shù)據(jù)庫遷移提交到生產(chǎn)環(huán)境數(shù)據(jù)庫當(dāng)中。如果其中任意一個(gè)遷移提交失敗了,那么這條命令將會(huì)退出并停止剩下的那些還未執(zhí)行的遷移。執(zhí)行這條命令期間不會(huì)有任何的遷移會(huì)被提交或還原。
簡(jiǎn)述
數(shù)據(jù)遷移就是數(shù)據(jù)庫表在團(tuán)隊(duì)建的遷移操作,達(dá)到團(tuán)隊(duì)相互間的信息同步,數(shù)據(jù)統(tǒng)一。
數(shù)據(jù)庫遷移一般步驟:
1、在 yii2 的 migrate 中,通常用來對(duì)數(shù)據(jù)庫數(shù)據(jù)表進(jìn)行修改操作,主要對(duì)結(jié)構(gòu)和小部分?jǐn)?shù)據(jù)進(jìn)行操作(很少會(huì)遇到大數(shù)據(jù),如果是面對(duì)數(shù)據(jù)量比較大的情況,采用數(shù)據(jù)表的直接導(dǎo)出導(dǎo)入)。
2、本地生成或修改數(shù)據(jù)庫表,后端執(zhí)行語句: ./yii migrate/create
3、后端執(zhí)行 migrate 指令后會(huì)生成一個(gè) migrate 腳本,這個(gè)腳本里面主要用來存放 SQL語句,也會(huì)隨著代碼發(fā)布而上傳,以供其他成員同步數(shù)據(jù)庫,實(shí)現(xiàn)真正的數(shù)據(jù)遷移。
4、其他成員拉去最新代碼回本地后,執(zhí)行 ./yii migrate 更新數(shù)據(jù)遷移狀態(tài),把最新的數(shù)據(jù)遷移同步到本地。
概念在開發(fā)和維護(hù)一個(gè)數(shù)據(jù)庫驅(qū)動(dòng)的應(yīng)用程序時(shí),數(shù)據(jù)庫的結(jié)構(gòu)會(huì)隨代碼的改變而改變。
例如,在開發(fā)應(yīng)用程序的過程中,會(huì)增加一張新表且必須得加進(jìn)來; 在應(yīng)用程序被部署到生產(chǎn)環(huán)境后,需要建立一個(gè)索引來提高查詢的性能等等。 因?yàn)橐粋€(gè)數(shù)據(jù)庫結(jié)構(gòu)發(fā)生改變的時(shí)候源代碼也經(jīng)常會(huì)需要做出改變,Yii 提供了一個(gè) 數(shù)據(jù)庫遷移 功能,該功能可以記錄數(shù)據(jù)庫的變化, 以便使數(shù)據(jù)庫和源代碼一起受版本控制。
如下的步驟向我們展示了數(shù)據(jù)庫遷移工具是如何為開發(fā)團(tuán)隊(duì)所使用的:
Tim 創(chuàng)建了一個(gè)新的遷移對(duì)象(例如,創(chuàng)建一張新的表單,改變字段的定義等)。
Tim 將這個(gè)新的遷移對(duì)象提交到代碼管理系統(tǒng)(例如,Git,Mercurial)。
Doug 從代碼管理系統(tǒng)當(dāng)中更新版本并獲取到這個(gè)新的遷移對(duì)象。
Doug 把這個(gè)遷移對(duì)象提交到本地的開發(fā)數(shù)據(jù)庫當(dāng)中,這樣一來,Doug 同步了 Tim 所做的修改。
如下的步驟向我們展示了如何發(fā)布一個(gè)附帶數(shù)據(jù)庫遷移的新版本到生產(chǎn)環(huán)境當(dāng)中:
Scott 為一個(gè)包含數(shù)據(jù)庫遷移的項(xiàng)目版本創(chuàng)建了一個(gè)發(fā)布標(biāo)簽。
Scott 把發(fā)布標(biāo)簽的源代碼更新到生產(chǎn)環(huán)境的服務(wù)器上。
Scott 把所有的增量數(shù)據(jù)庫遷移提交到生產(chǎn)環(huán)境數(shù)據(jù)庫當(dāng)中。
Yii 提供了一整套的遷移命令行工具,通過這些工具你可以:
創(chuàng)建新的遷移(./yii migrate/create 遷移描述);
提交遷移;
恢復(fù)遷移;
重新提交遷移;
現(xiàn)實(shí)遷移歷史和狀態(tài)。
所有的這些工具都可以通過 yii migrate 命令來進(jìn)行操作。
注意:遷移不僅僅只作用于數(shù)據(jù)庫表,它同樣會(huì)調(diào)整現(xiàn)有的數(shù)據(jù)來適應(yīng)新的表單、創(chuàng)建 RBAC 分層、又或者是清除緩存。
使用如下命令來創(chuàng)建一個(gè)新的遷移:
yii migrate/create
必填參數(shù) name 的作用是對(duì)新的遷移做一個(gè)簡(jiǎn)要的描述。
例如,如果這個(gè)遷移是用來創(chuàng)建一個(gè)叫做 news 的表單的,那么你可以使用create_news_table 這個(gè)名稱并運(yùn)行如下命令:
yii migrate/create create_news_table
注意:因?yàn)?name 參數(shù)會(huì)被用來生成遷移的類名的一部分,所以該參數(shù)應(yīng)當(dāng)只包含字母、數(shù)字和下劃線。
如上命令將會(huì)在 @app/migrations 目錄下創(chuàng)建一個(gè)新的名為 m150101_185401_create_news_table.php 的 PHP 類文件。
該文件包含如下的代碼,它們用來聲明一個(gè)遷移類 m150101_185401_create_news_table,并附有代碼框架:
每個(gè)數(shù)據(jù)庫遷移都會(huì)被定義為一個(gè)繼承自 yiidbMigration 的 PHP 類。類的名稱按照 m
_ 的格式自動(dòng)生成,其中
指執(zhí)行創(chuàng)建遷移命令的 UTC 時(shí)間。
和你執(zhí)行命令時(shí)所帶的 name 參數(shù)值相同。 在遷移類當(dāng)中,你應(yīng)當(dāng)在 up() 方法中編寫改變數(shù)據(jù)庫結(jié)構(gòu)的代碼。你可能還需要在 down() 方法中編寫代碼來恢復(fù)由 up() 方法所做的改變。
當(dāng)你通過 migration 升級(jí)數(shù)據(jù)庫時(shí), up() 方法將會(huì)被調(diào)用,反之, down() 將會(huì)被調(diào)用。如下代碼展示了如何通過遷移類來創(chuàng)建一張 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"); } }注意:并不是所有遷移都是可恢復(fù)的。
例如,如果 up() 方法刪除了表中的一行數(shù)據(jù),這將無法通過 down() 方法來恢復(fù)這條數(shù)據(jù)。有時(shí)候,你也許只是懶得去執(zhí)行 down() 方法了,因?yàn)樗诨謴?fù)數(shù)據(jù)庫遷移方面并不是那么的通用。在這種情況下,你應(yīng)當(dāng)在 down() 方法中返回 false 來表明這個(gè) migration 是無法恢復(fù)的。
提交遷移為了將數(shù)據(jù)庫升級(jí)到最新的結(jié)構(gòu),你應(yīng)該使用如下命令來提交所有新的遷移:
yii migrate這條命令會(huì)列出迄今為止所有未提交的遷移。
如果你確定你需要提交這些遷移,它將會(huì)按照類名當(dāng)中的時(shí)間戳的順序,一個(gè)接著一個(gè)的運(yùn)行每個(gè)新的遷移類里面的 up() 或者是 safeUp() 方法。如果其中任意一個(gè)遷移提交失敗了,那么這條命令將會(huì)退出并停止剩下的那些還未執(zhí)行的遷移。
對(duì)于每一個(gè)成功提交的遷移,這條命令都會(huì)在一個(gè)叫做 migration 的數(shù)據(jù)庫表中插入一條包含應(yīng)用程序成功提交遷移的記錄,該記錄將幫助遷移工具判斷哪些遷移已經(jīng)提交, 哪些還沒有提交。
提示:遷移工具將會(huì)自動(dòng)在數(shù)據(jù)庫當(dāng)中創(chuàng)建 migration 表,該數(shù)據(jù)庫是在該命令的 yiiconsolecontrollersMigrateController::db 選項(xiàng)當(dāng)中指定的。默認(rèn)情況下,是由 db application component 指定的。
有時(shí),你可能只需要提交一個(gè)或者少數(shù)的幾個(gè)遷移,你可以使用該命令指定需要執(zhí)行的條數(shù),而不是執(zhí)行所有的可用遷移。例如,如下命令將會(huì)嘗試提交前三個(gè)可用的遷移:
yii migrate 3你也可以指定一個(gè)特定的遷移,按照如下格式使用 migrate/to 命令來指定數(shù)據(jù)庫應(yīng)該提交哪一個(gè)遷移:
yii migrate/to 150101_185401 # using timestamp to specify the migration 使用時(shí)間戳來指定遷移 yii migrate/to "2015-01-01 18:54:01" # using a string that can be parsed by strtotime() 使用一個(gè)可以被 strtotime() 解析的字符串 yii migrate/to m150101_185401_create_news_table # using full name 使用全名 yii migrate/to 1392853618 # using UNIX timestamp 使用 UNIX 時(shí)間戳如果在指定要提交的遷移前面還有未提交的遷移,那么在執(zhí)行這個(gè)被指定的遷移之前,這些還未提交的遷移會(huì)先被提交。
如果被指定提交的遷移在之前已經(jīng)被提交過,那么在其之后的那些遷移將會(huì)被還原。
還原遷移你可以使用如下命令來還原其中一個(gè)或多個(gè)意見被提交過的遷移:
yii migrate/down # revert the most recently applied migration 還原最近一次提交的遷移 yii migrate/down 3 # revert the most 3 recently applied migrations 還原最近三次提交的遷移注意:并不是所有的遷移都能被還原。嘗試還原這類遷移將可能導(dǎo)致報(bào)錯(cuò)甚至是終止所有的還原進(jìn)程。
重做遷移重做遷移的意思是先還原指定的遷移,然后再次提交。如下所示:
yii migrate/redo # redo the last applied migration 重做最近一次提交的遷移 yii migrate/redo 3 # redo the last 3 applied migrations 重做最近三次提交的遷移注意:如果一個(gè)遷移是不能被還原的,那么你將無法對(duì)它進(jìn)行重做。
列出遷移你可以使用如下命令列出那些提交了的或者是還未提交的遷移:
yii migrate/history # 顯示最近10次提交的遷移 yii migrate/history 5 # 顯示最近5次提交的遷移 yii migrate/history all # 顯示所有已經(jīng)提交過的遷移 yii migrate/new # 顯示前10個(gè)還未提交的遷移 yii migrate/new 5 # 顯示前5個(gè)還未提交的遷移 yii migrate/new all # 顯示所有還未提交的遷移修改遷移歷史有時(shí)候你也許需要簡(jiǎn)單的標(biāo)記一下你的數(shù)據(jù)庫已經(jīng)升級(jí)到一個(gè)特定的遷移,而不是實(shí)際提交或者是還原遷移。這個(gè)經(jīng)常會(huì)發(fā)生在你手動(dòng)的改變數(shù)據(jù)庫的一個(gè)特定狀態(tài),而又不想相應(yīng)的遷移被重復(fù)提交。那么你可以使用如下命令來達(dá)到目的:
yii migrate/mark 150101_185401 # 使用時(shí)間戳來指定遷移 yii migrate/mark "2015-01-01 18:54:01" # 使用一個(gè)可以被 strtotime() 解析的字符串 yii migrate/mark m150101_185401_create_news_table # 使用全名 yii migrate/mark 1392853618 # 使用 UNIX 時(shí)間戳該命令將會(huì)添加或者刪除 migration 表當(dāng)中的某幾行數(shù)據(jù)來表明數(shù)據(jù)庫已經(jīng)提交到了指定的某個(gè)遷移上。
執(zhí)行這條命令期間不會(huì)有任何的遷移會(huì)被提交或還原。
全局配置命令在運(yùn)行遷移命令的時(shí)候每次都要重復(fù)的輸入一些同樣的參數(shù)會(huì)很煩人,這時(shí)候,你可以選擇在應(yīng)用程序配置當(dāng)中進(jìn)行全局配置,一勞永逸:
return [ "controllerMap" => [ "migrate" => [ "class" => "yiiconsolecontrollersMigrateController", "migrationTable" => "backend_migration", ], ], ];如上所示配置,在每次運(yùn)行遷移命令的時(shí)候,backend_migration 表將會(huì)被用來記錄遷移歷史。你再也不需要通過migrationTable 命令行參數(shù)來指定這張歷史紀(jì)錄表了。
遷移多個(gè)數(shù)據(jù)庫默認(rèn)情況下,遷移將會(huì)提交到由 db application component 所定義的同一個(gè)數(shù)據(jù)庫當(dāng)中。如果你需要提交到不同的數(shù)據(jù)庫,你可以像下面那樣指定 db 命令行選項(xiàng),
yii migrate --db=db2上面的命令將會(huì)把遷移提交到 db2 數(shù)據(jù)庫當(dāng)中。
偶爾有限時(shí)候你需要提交 一些 遷移到一個(gè)數(shù)據(jù)庫,而另外一些則提交到另一個(gè)數(shù)據(jù)庫。為了達(dá)到這個(gè)目的,你應(yīng)該在實(shí)現(xiàn)一個(gè)遷移類的時(shí)候指定需要用到的數(shù)據(jù)庫組件的 ID , 如下所示:
use yiidbSchema; use yiidbMigration; class m150101_185401_create_news_table extends Migration{ public function init() { $this->db = "db2"; parent::init(); } }即使你使用 db 命令行選項(xiàng)指定了另外一個(gè)不同的數(shù)據(jù)庫,上面的遷移還是會(huì)被提交到 db2 當(dāng)中。需要注意的是這個(gè)時(shí)候遷移的歷史信息依然會(huì)被記錄到 db 命令行選項(xiàng)所指定的數(shù)據(jù)庫當(dāng)中。
如果有多個(gè)遷移都使用到了同一個(gè)數(shù)據(jù)庫,那么建議你創(chuàng)建一個(gè)遷移的基類,里面包含上述的 init() 代碼。然后每個(gè)遷移類都繼承這個(gè)基類就可以了。
提示:除了在 yiidbMigration::db 參數(shù)當(dāng)中進(jìn)行設(shè)置以外,你還可以通過在遷移類中創(chuàng)建新的數(shù)據(jù)庫連接來操作不同的數(shù)據(jù)庫。然后通過這些連接再使用 DAO 方法 來操作不同的數(shù)據(jù)庫。
另外一個(gè)可以讓你遷移多個(gè)數(shù)據(jù)庫的策略是把遷移存放到不同的目錄下,然后你可以通過如下命令分別對(duì)不同的數(shù)據(jù)庫進(jìn)行遷移:
yii migrate --migrationPath=@app/migrations/db1 --db=db1 yii migrate --migrationPath=@app/migrations/db2 --db=db2 ...第一條命令將會(huì)把 @app/migrations/db1 目錄下的遷移提交到 db1 數(shù)據(jù)庫當(dāng)中,第二條命令則會(huì)把 @app/migrations/db2 下的遷移提交到 db2 數(shù)據(jù)庫當(dāng)中,以此類推。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21610.html
摘要:它由一個(gè)或多個(gè)類組成,它們?cè)诳刂婆_(tái)環(huán)境下通常被稱為命令。控制臺(tái)入口腳本通常被稱為,位于應(yīng)用程序的根目錄。選項(xiàng)通過覆蓋在中的方法,你可以指定可用于控制臺(tái)命令選項(xiàng)。參數(shù)將傳遞給請(qǐng)求的子命令對(duì)應(yīng)的操作方法。通常,執(zhí)行成功的命令會(huì)返回。 簡(jiǎn)述 控制臺(tái)應(yīng)用程序的結(jié)構(gòu)非常類似于 Yii 的一個(gè) Web 應(yīng)用程序,主要用于終端服務(wù)器執(zhí)行。 控制臺(tái)命令 控制臺(tái)應(yīng)用程序的結(jié)構(gòu)非常類似于 Yii 的一個(gè) ...
摘要:運(yùn)行來安裝指定的擴(kuò)展。這更便于用戶辨別是否是的擴(kuò)展。當(dāng)用戶運(yùn)行安裝一個(gè)擴(kuò)展時(shí),文件會(huì)被自動(dòng)更新使之包含新擴(kuò)展的信息。上述代碼表明該擴(kuò)展依賴于包。例如,上述的條目聲明將對(duì)應(yīng)于別名。為達(dá)到這個(gè)目的,你應(yīng)當(dāng)在公開發(fā)布前做測(cè)試。 簡(jiǎn)述 擴(kuò)展是專門設(shè)計(jì)的在 Yii 應(yīng)用中隨時(shí)可拿來使用的, 并可重發(fā)布的軟件包。 基礎(chǔ) 例如, yiisoft/yii2-debug 擴(kuò)展在你的應(yīng)用的每個(gè)頁面底部添加...
摘要:簡(jiǎn)述是一個(gè)強(qiáng)大的代碼生成器,主要用于后臺(tái)代碼生成。下面列出由生成的文件,以便你研習(xí)功能和實(shí)現(xiàn),或修改它們控制器模型和視圖補(bǔ)充被設(shè)計(jì)成高度可定制和可擴(kuò)展的代碼生成工具。使用生成代碼是一個(gè)基于界面的代碼生成工具。 簡(jiǎn)述 Gii 是一個(gè)強(qiáng)大的代碼生成器,主要用于后臺(tái)代碼生成。 開始 Gii Gii 是 Yii 中的一個(gè)模塊。可以通過配置應(yīng)用的 yiibaseApplication::modu...
摘要:認(rèn)證事件類在登錄和注銷流程引發(fā)一些事件。成功注銷后引發(fā)。提供兩種授權(quán)方法存取控制過濾器和基于角色的存取控制。允許已認(rèn)證用戶執(zhí)行操作。指定一個(gè)回調(diào)函數(shù)用于判定該規(guī)則是否滿足條件。 簡(jiǎn)述 在程序開發(fā)過程中,往往都不能忽視安全問題,無論你的框架有多么完美,都會(huì)有破綻,所以完善自己的系統(tǒng),從程序開發(fā)的安全角度去思考問題,把一切潛在的危機(jī)扼殺在搖籃中。 認(rèn)證(Authentication) 認(rèn)證...
摘要:簡(jiǎn)述這里簡(jiǎn)單歸納總結(jié)關(guān)于的錯(cuò)誤處理和日志記錄的操作。錯(cuò)誤處理器會(huì)正確地設(shè)置響應(yīng)的狀態(tài)碼并使用合適的錯(cuò)誤視圖頁面來顯示錯(cuò)誤信息。記錄一個(gè)警告消息用來指示一些已經(jīng)發(fā)生的意外。的義務(wù)是正確處理日志消息。相應(yīng)的消息通過被記錄。 簡(jiǎn)述 這里簡(jiǎn)單歸納總結(jié)關(guān)于Yii的錯(cuò)誤處理和日志記錄的操作。 錯(cuò)誤處理(Errors) Yii 內(nèi)置了一個(gè)yiiwebErrorHandler錯(cuò)誤處理器,它使錯(cuò)誤處理更...
閱讀 3574·2019-08-30 15:55
閱讀 1373·2019-08-29 16:20
閱讀 3656·2019-08-29 12:42
閱讀 2661·2019-08-26 10:35
閱讀 1010·2019-08-26 10:23
閱讀 3405·2019-08-23 18:32
閱讀 897·2019-08-23 18:32
閱讀 2892·2019-08-23 14:55