摘要:是基于組件的數(shù)據(jù)遷移組件。版本管理把數(shù)據(jù)庫(kù)變更寫入到代碼中,來(lái)進(jìn)行版本管理。此系列文章不討論現(xiàn)有框架中數(shù)據(jù)遷移組件的使用,而是著重于探討如何多帶帶使用遷移組件以及如何把數(shù)據(jù)遷移組件集成到自己的項(xiàng)目個(gè)性化定制。
場(chǎng)景分析
團(tuán)隊(duì)開發(fā)中,每個(gè)開發(fā)人員對(duì)于數(shù)據(jù)庫(kù)都修改都必須手動(dòng)記錄,上線時(shí)需要人工整理,運(yùn)維成本極高。而且在多個(gè)開發(fā)者之間數(shù)據(jù)結(jié)構(gòu)同步也是很大的問(wèn)題。Doctrine Migrations組件把數(shù)據(jù)庫(kù)變更加入到代碼中和代碼一起進(jìn)行版本管理,很好的解決了上述問(wèn)題。
Doctrine Migrations是基于Doctrine DBAL組件的數(shù)據(jù)遷移組件。集成于Laravel,Symfony等主流框架。大概可以分為兩種方式進(jìn)行遷移,即版本管理方式和diff方式。
版本管理:把數(shù)據(jù)庫(kù)變更寫入到代碼中,來(lái)進(jìn)行版本管理。Laravel框架就是版本管理的模式,遷移組件默認(rèn)的命令行就是支持這種模式。
diff:把現(xiàn)有數(shù)據(jù)庫(kù)結(jié)構(gòu)和代碼里面的數(shù)據(jù)庫(kù)結(jié)構(gòu)來(lái)做對(duì)比,執(zhí)行差異的sql以保證一致性。一般需要ORM的支持,Symfony框架就是使用Doctrine2ORM工具加上Doctrine DBAL來(lái)進(jìn)行diff方式的數(shù)據(jù)遷移。
此系列文章不討論現(xiàn)有框架中數(shù)據(jù)遷移組件的使用,而是著重于探討如何多帶帶使用遷移組件以及如何把數(shù)據(jù)遷移組件集成到自己的項(xiàng)目、個(gè)性化定制。
安裝composer安裝
composer require doctrine/migrations ~1.8.0
本系列使用的是目前最新的1.8.1版本配置
安裝之后不能直接使用,還需要進(jìn)行組件配置以及數(shù)據(jù)庫(kù)配置:
根目錄下建立migrations.php文件,配置組件:
return [ "name" => "Doctrine Migrations", // 組件顯示名稱 "migrations_namespace" => "dbmigrations", // 遷移類的命名空間 "table_name" => "migration_versions", // 遷移組件的表名 "migrations_directory" => "db/migrations", // 遷移類的文件夾 ];
詳情的配置參數(shù)參見官方文檔。
根目錄下簡(jiǎn)歷migrations-db.php文件,配置數(shù)據(jù)庫(kù)信息:
return [ "driver" => "pdo_mysql", "host" => "localhost", "port" => 3306, "user" => "root", "password" => "1236", "dbname" => "migrations", ];
到此,組件需要的配置已經(jīng)完成。
使用
運(yùn)行vendor目錄下面的命令生成版本遷移類文件。
./vendor/bin/doctrine-migrations migrations:generate
在遷移類目錄/db/migrations下面生成Version20180608155932.php類文件,此文件即是用于寫入遷移sql的類,Version后面的數(shù)字則是當(dāng)前版本號(hào)。
重寫up方法,用于執(zhí)行遷移sql:
public function up(Schema $schema): void { $table = $schema->createTable("test1"); $table->addColumn("id", "integer")->setUnsigned(true)->setAutoincrement(true); $table->addColumn("name", "string")->setDefault("")->setLength(20); $table->setPrimaryKey(["id"]); }
這個(gè)腳本是生成一個(gè)test1的表。
重寫down方法,用于版本回退,撤銷up方法的遷移操作:
public function down(Schema $schema): void { if ($schema->hasTable("test1")) { $schema->dropTable("test1"); } }
執(zhí)行遷移命令:
./vendor/bin/doctrine-migrations migrations:migrate
這樣就成功的創(chuàng)建了一個(gè)版本的遷移數(shù)據(jù)。遷移類腳本可以使用$schema來(lái)操作數(shù)據(jù)庫(kù)實(shí)體,也可以使用$this->addSql()方法來(lái)直接寫入相關(guān)的sql,詳細(xì)參加官方文檔對(duì)于腳本編寫的詳細(xì)說(shuō)明,此處不過(guò)多展開。
版本管理既然遷移使用版本管理,那么多個(gè)版本之間可以來(lái)回切換。下面是相關(guān)的版本切換命令:
./vendor/bin/doctrine-migrations migrations:migrate 20180608161758
這條命令是恢復(fù)到20180608161758版本,除了直接輸入具體版本號(hào)之外,還有更加方便的版本別名:
first:回退到初始版本
prev:回到上一個(gè)版本
next:遷移到下一個(gè)版本
latest:遷移到最新版本(和不加版本號(hào)效果一樣)
常用命令# 生成遷移腳本 php migration.php migrations:generate # 執(zhí)行遷移到最新版本 php migration.php migrations:migrate # --dry-run是空轉(zhuǎn)參數(shù),只顯示操作結(jié)果,不執(zhí)行修改 php migration.php migrations:migrate --dry-run # 不執(zhí)行操作,只寫入文件,對(duì)于生產(chǎn)環(huán)境需要手動(dòng)驗(yàn)證并執(zhí)行的場(chǎng)景有用 php migration.php migrations:migrate --write-sql=file.sql # 查看詳細(xì)信息 php migration.php status結(jié)語(yǔ)
到此,就學(xué)會(huì)了migrations組件的基本使用,但是還有如下幾個(gè)問(wèn)題需要我們解決:
一般項(xiàng)目中都會(huì)有數(shù)據(jù)庫(kù)配置文件,如何讓組件公用項(xiàng)目中的配置文件?
現(xiàn)在遷移組件所需要的配置文件只能在根目錄,如何讓配置文件更合理的歸檔?
命令行又長(zhǎng)又難記,如何簡(jiǎn)單使用命令行?
下一章,我們會(huì)解決以上問(wèn)題,并且讓組件更個(gè)性化的融入到我們自己的項(xiàng)目中去。
在我的代碼庫(kù)可以查看這篇文章的詳細(xì)代碼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28781.html
摘要:結(jié)語(yǔ)到此,數(shù)據(jù)遷移組件就已經(jīng)很靈活的集成到我們自己的項(xiàng)目中了,而且你還可以根據(jù)自己的項(xiàng)目靈活修改自定義命令腳本文件。但是如果使用久了會(huì)發(fā)現(xiàn)現(xiàn)在的數(shù)據(jù)遷移會(huì)有兩個(gè)問(wèn)題不支持類型,在相關(guān)中,官方開發(fā)人員有回復(fù)所以只能添加自定義類型。 自定義命令腳本 目錄結(jié)構(gòu) 目前的項(xiàng)目結(jié)構(gòu)是這樣的(參照代碼庫(kù)): showImg(https://segmentfault.com/img/remote/14...
摘要:自定義根據(jù)官方文檔,新建類,集成,并重寫,,,等方法。如果集成遷移組件的時(shí)候數(shù)據(jù)庫(kù)里已經(jīng)存在表且有類型的字段,那么執(zhí)行遷移命令時(shí)就會(huì)報(bào)錯(cuò)。下一章我們來(lái)詳細(xì)研究如何集成方式的數(shù)據(jù)遷移組件。 自定義type 根據(jù)官方文檔,新建TinyIntType類,集成Type,并重寫getName,getSqlDeclaration,convertToPHPValue,getBindingType等方...
摘要:安全生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù)一個(gè)兼容標(biāo)準(zhǔn)的過(guò)濾器一個(gè)生成隨機(jī)數(shù)和字符串的庫(kù)使用生成隨機(jī)數(shù)的庫(kù)一個(gè)安全庫(kù)一個(gè)純安全通信庫(kù)一個(gè)簡(jiǎn)單的鍵值加密存儲(chǔ)庫(kù)一個(gè)結(jié)構(gòu)化的安全層一個(gè)試驗(yàn)的面向?qū)ο蟮陌b庫(kù)一個(gè)掃描文件安全的庫(kù) Security 安全 生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù) HTML Purifier-一個(gè)兼容標(biāo)準(zhǔn)的HTML過(guò)濾器 RandomLib-一個(gè)生成隨機(jī)數(shù)和字...
摘要:安全生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù)一個(gè)兼容標(biāo)準(zhǔn)的過(guò)濾器一個(gè)生成隨機(jī)數(shù)和字符串的庫(kù)使用生成隨機(jī)數(shù)的庫(kù)一個(gè)安全庫(kù)一個(gè)純安全通信庫(kù)一個(gè)簡(jiǎn)單的鍵值加密存儲(chǔ)庫(kù)一個(gè)結(jié)構(gòu)化的安全層一個(gè)試驗(yàn)的面向?qū)ο蟮陌b庫(kù)一個(gè)掃描文件安全的庫(kù) Security 安全 生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù) HTML Purifier-一個(gè)兼容標(biāo)準(zhǔn)的HTML過(guò)濾器 RandomLib-一個(gè)生成隨機(jī)數(shù)和字...
閱讀 3702·2021-11-11 11:00
閱讀 2180·2021-10-08 10:05
閱讀 2671·2021-10-08 10:04
閱讀 3204·2021-09-30 09:48
閱讀 3763·2021-09-27 14:10
閱讀 1704·2021-09-09 09:33
閱讀 2100·2019-08-30 15:55
閱讀 1602·2019-08-30 13:53