成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

yii2.0數(shù)據(jù)庫遷移的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹了yii2.0數(shù)據(jù)庫遷移的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)服務(wù),網(wǎng)站設(shè)計(jì),網(wǎng)站改版維護(hù)等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競(jìng)爭(zhēng)對(duì)手中脫穎而出創(chuàng)新互聯(lián)。

具體如下:

創(chuàng)建遷移

使用如下命令來創(chuàng)建一個(gè)新的遷移:

yii migrate/create <name>

必填參數(shù) name 的作用是對(duì)新的遷移做一個(gè)簡要的描述。例如,如果這個(gè)遷移是用來往多個(gè)數(shù)據(jù)庫同一張表  ( 假設(shè)每個(gè)數(shù)據(jù)庫都有news表 )   添加字段的,那么你可以使用addColumn_news (該名稱自定義)這個(gè)名稱并運(yùn)行如下命令:

yii migrate/create addColumn_news

注意:因?yàn)?name 參數(shù)會(huì)被用來生成遷移的類名的一部分,所以該參數(shù)應(yīng)當(dāng)只包含字母、數(shù)字和下劃線。

如上命令將會(huì)在 @app/migrations 目錄下創(chuàng)建一個(gè)新的名為 m150101_185401_addColumn_news.php 的 PHP 類文件。該文件包含如下的代碼,它們用來聲明一個(gè)遷移類 m150101_185401_addColumn_news,并附有代碼框架:

<?php
use yii\db\Schema;
use yii\db\Migration;
class m150101_185401_addColumn_news extends Migration
{
//createDbs 該方法是獲取數(shù)據(jù)庫對(duì)象返回
private function createDbs(){
  $dbs = [];
  $dbs_info =\Yii::$app->params['db'];
  foreach($dbs_info as $k=>$v){
    $dbs[$k] = \Yii::createObject($v);
  }
  return $dbs;
}
//up() 該方法是往不同的數(shù)據(jù)庫的news表添加 name,nickname,age,sex,site_id等字段
public function up()
{
  $dbs = $this->createDbs();
  foreach($dbs as $v){   //《------遍歷講字段同時(shí)添加到不同的數(shù)據(jù)庫中
    $this->db=$v;
    $this->addColumn('{{%news}}','name','varchar(20)');
    $this->addColumn('{{%news}}','nickname','varchar(20)');
    $this->addColumn('{{%news}}','age','int(3)');
    $this->addColumn('{{%news}}','sex','int(1)');
    $this->addColumn('{{%news}}','site_id','int(5)');
  }
}
//down()  該方法與up()方法相反,是刪除字段的意思
public function down()
{
  $dbs = $this->createDbs();
  foreach($dbs as $v){
    $this->db=$v;
    $this->dropColumn('{{%news}}','name','varchar(20)');
    $this->dropColumn('{{%news}}','nickname','varchar(20)');
    $this->dropColumn('{{%news}}','age','int(3)');
    $this->dropColumn('{{%news}}','sex','int(1)');
    $this->dropColumn('{{%news}}','site_id','int(5)');
  }
}
}

每個(gè)數(shù)據(jù)庫遷移都會(huì)被定義為一個(gè)繼承自 yii\db\Migration 的 PHP 類。類的名稱按照 m<YYMMDD_HHMMSS>_<Name> 的格式自動(dòng)生成,其中

<YYMMDD_HHMMSS> 指執(zhí)行創(chuàng)建遷移命令的 UTC 時(shí)間。

<Name> 和你執(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 yii\db\Schema;
use yii\db\Migration;
class m150101_185401_create_news_table extends \yii\db\Migration
{
  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ù)庫的方法

遷移的基類 yii\db\Migration 提供了一整套訪問和操作數(shù)據(jù)庫的方法。你可能會(huì)發(fā)現(xiàn)這些方法的命名和 yii\db\Command 類提供的 DAO 方法很類似。 例如,yii\db\Migration::createTable() 方法可以創(chuàng)建一張新的表,這和 yii\db\Command::createTable() 的功能是一模一樣的。

使用 yii\db\Migration 所提供的方法的好處在于你不需要再顯式的創(chuàng)建 yii\db\Command 實(shí)例,而且在執(zhí)行每個(gè)方法的時(shí)候都會(huì)顯示一些有用的信息來告訴我們數(shù)據(jù)庫操作是不是都已經(jīng)完成,還有它們完成這些操作花了多長時(shí)間等等。

如下是所有這些數(shù)據(jù)庫訪問方法的列表:

yii\db\Migration::execute(): 執(zhí)行一條 SQL 語句
yii\db\Migration::insert(): 插入單行數(shù)據(jù)
yii\db\Migration::batchInsert(): 插入多行數(shù)據(jù)
yii\db\Migration::update(): 更新數(shù)據(jù)
yii\db\Migration::delete(): 刪除數(shù)據(jù)
yii\db\Migration::createTable(): 創(chuàng)建表
yii\db\Migration::renameTable(): 重命名表名
yii\db\Migration::dropTable(): 刪除一張表
yii\db\Migration::truncateTable(): 清空表中的所有數(shù)據(jù)
yii\db\Migration::addColumn(): 加一個(gè)字段
yii\db\Migration::renameColumn(): 重命名字段名稱
yii\db\Migration::dropColumn(): 刪除一個(gè)字段
yii\db\Migration::alterColumn(): 修改字段
yii\db\Migration::addPrimaryKey(): 添加一個(gè)主鍵
yii\db\Migration::dropPrimaryKey(): 刪除一個(gè)主鍵
yii\db\Migration::addForeignKey(): 添加一個(gè)外鍵
yii\db\Migration::dropForeignKey(): 刪除一個(gè)外鍵
yii\db\Migration::createIndex(): 創(chuàng)建一個(gè)索引
yii\db\Migration::dropIndex(): 刪除一個(gè)索引

提交遷移

為了將數(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ù)庫是在該命令的 yii\console\controllers\MigrateController::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í)候你也許需要簡單的標(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ì)被提交或還原。

自定義遷移

有很多方法可以自定義遷移命令。

使用命令行選項(xiàng)

遷移命令附帶了幾個(gè)命令行選項(xiàng),可以用來自定義它的行為:

interactive: boolean (默認(rèn)值為 true),指定是否以交互模式來運(yùn)行遷移。當(dāng)被設(shè)置為 true 時(shí),在命令執(zhí)行某些操作前,會(huì)提示用戶。如果你希望在后臺(tái)執(zhí)行該命令,那么你應(yīng)該把它設(shè)置成 false。

migrationPath: string (默認(rèn)值為 @app/migrations),指定存放所有遷移類文件的目錄。該選項(xiàng)可以是一個(gè)目錄的路徑,也可以是 路徑別名。需要注意的是指定的目錄必選存在,否則將會(huì)觸發(fā)一個(gè)錯(cuò)誤。

migrationTable: string (默認(rèn)值為 migration),指定用于存儲(chǔ)遷移歷史信息的數(shù)據(jù)庫表名稱。如果這張表不存在,那么遷移命令將自動(dòng)創(chuàng)建這張表。當(dāng)然你也可以使用這樣的字段結(jié)構(gòu): version
 varchar(255) primary key, apply_time integer 來手動(dòng)創(chuàng)建這張表。

db: string (默認(rèn)值為 db),指定數(shù)據(jù)庫 application component 的 ID。它指的是將會(huì)被該命令遷移的數(shù)據(jù)庫。

templateFile: string (defaults to @yii/views/migration.php),指定生產(chǎn)遷移框架代碼類文件的模版文件路徑。該選項(xiàng)即可以使用文件路徑來指定,也可以使用路徑 別名 來指定。該模版文件是一個(gè)可以使用預(yù)定義變量 $className 來獲取遷移類名稱的 PHP 腳本。

如下例子向我們展示了如何使用這些選項(xiàng):

例如,如果我們需要遷移一個(gè) forum 模塊,而該遷移文件放在該模塊下的 migrations 目錄當(dāng)中,那么我們可以使用如下命令:

# 在 forum 模塊中以非交互模式進(jìn)行遷移
yii migrate --migrationPath=@app/modules/forum/migrations --interactive=0

全局配置命令

在運(yùn)行遷移命令的時(shí)候每次都要重復(fù)的輸入一些同樣的參數(shù)會(huì)很煩人,這時(shí)候,你可以選擇在應(yīng)用程序配置當(dāng)中進(jìn)行全局配置,一勞永逸:

return [
  'controllerMap' => [
    'migrate' => [
      'class' => 'yii\console\controllers\MigrateController',
      '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 yii\db\Schema;
use yii\db\Migration;
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è)基類就可以了。

提示:除了在 yii\db\Migration::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)中,以此類推。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“yii2.0數(shù)據(jù)庫遷移的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

標(biāo)題名稱:yii2.0數(shù)據(jù)庫遷移的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://jinyejixie.com/article32/iscpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站排名微信公眾號(hào)、網(wǎng)站設(shè)計(jì)公司、營銷型網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
赣州市| 清水县| 三台县| 宜兰县| 上栗县| 青龙| 图木舒克市| 从江县| 会泽县| 荔波县| 鹤壁市| 馆陶县| 新巴尔虎右旗| 北碚区| 漠河县| 安仁县| 桃园市| 桓台县| 夏邑县| 五家渠市| 潮州市| 台北市| 武强县| 濮阳县| 白玉县| 忻城县| 麻江县| 雷州市| 许昌市| 射阳县| 正定县| 民勤县| 黄冈市| 东阳市| 高邑县| 大姚县| 阳新县| 铜山县| 津南区| 新野县| 正宁县|