摘要:結(jié)語到此,數(shù)據(jù)遷移組件就已經(jīng)很靈活的集成到我們自己的項(xiàng)目中了,而且你還可以根據(jù)自己的項(xiàng)目靈活修改自定義命令腳本文件。但是如果使用久了會(huì)發(fā)現(xiàn)現(xiàn)在的數(shù)據(jù)遷移會(huì)有兩個(gè)問題不支持類型,在相關(guān)中,官方開發(fā)人員有回復(fù)所以只能添加自定義類型。
自定義命令腳本 目錄結(jié)構(gòu)
目前的項(xiàng)目結(jié)構(gòu)是這樣的(參照代碼庫):
其中,db/migrations文件夾是遷移類文件夾,config/db.php是我們項(xiàng)目原有的db配置,migrations.php和migrations-db.php是遷移組件需要的配置文件。
編寫自定義命令腳本現(xiàn)在先在根目錄新建文件:migrate,沒有后綴名,并且添加可執(zhí)行權(quán)限。
并且參照組件原有的命令腳本vendor/doctrine/migrations/doctrine-migrations.php,首先獲取項(xiàng)目原有的數(shù)據(jù)庫配置信息,替換掉migrations-db.php數(shù)據(jù)庫配置文件:
$db_config = include "config/db.php"; $db_params = [ "driver" => "pdo_mysql", "host" => $db_config["host"], "port" => $db_config["port"], "dbname" => $db_config["dbname"], "user" => $db_config["user"], "password" => $db_config["password"], ]; try { $connection = DriverManager::getConnection($db_params); } catch (DBALException $e) { echo $e->getMessage() . PHP_EOL; exit; }
然后配置組件,替換掉migrations.php配置文件:
$configuration = new Configuration($connection); $configuration->setName("Doctrine Migrations"); $configuration->setMigrationsNamespace("dbmigrations"); $configuration->setMigrationsTableName("migration_versions"); $configuration->setMigrationsDirectory("db/migrations");
最后是完整的命令腳本代碼:
#!/usr/bin/env php "pdo_mysql", "host" => $db_config["host"], "port" => $db_config["port"], "dbname" => $db_config["dbname"], "user" => $db_config["user"], "password" => $db_config["password"], ]; try { $connection = DriverManager::getConnection($db_params); } catch (DBALException $e) { echo $e->getMessage() . PHP_EOL; exit; } // 遷移組件配置 $configuration = new Configuration($connection); $configuration->setName("Doctrine Migrations"); $configuration->setMigrationsNamespace("dbmigrations"); $configuration->setMigrationsTableName("migration_versions"); $configuration->setMigrationsDirectory("db/migrations"); // 創(chuàng)建命令腳本 $helper_set = new HelperSet([ "question" => new QuestionHelper(), "db" => new ConnectionHelper($connection), new ConfigurationHelper($connection, $configuration), ]); $cli = ConsoleRunner::createApplication($helper_set); try { $cli->run(); } catch (Exception $e) { echo $e->getMessage() . PHP_EOL; }
現(xiàn)在執(zhí)行遷移相關(guān)命令時(shí),用./migrate替換之前的vendor/bin/doctrine-migrations部分即可。
同時(shí)migrations.php和migrations-db.php這兩個(gè)配置文件也可以刪除了。
PhpStorm集成遷移命令如果你使用PhpStorm,命令行還可以集成到開發(fā)工具中去,會(huì)有自動(dòng)提示,大大提高工作效率:
PhpStorm -> Preferences -> Command Line Tool Support -> 添加
Choose tool選擇Tool based on Symfony Console,點(diǎn)擊OK
Alias輸入m, Path to PHP executable 選擇php路徑,path to script選擇跟目錄下的migrate文件
點(diǎn)擊OK,提示 Found 9 commands 則配置成功。
PhpStorm -> Tools -> Run Command,彈出命令窗口,輸入m即會(huì)出現(xiàn)命令提示。
結(jié)語到此,數(shù)據(jù)遷移組件就已經(jīng)很靈活的集成到我們自己的項(xiàng)目中了,而且你還可以根據(jù)自己的項(xiàng)目靈活修改自定義命令腳本文件。
但是如果使用久了會(huì)發(fā)現(xiàn)現(xiàn)在的數(shù)據(jù)遷移會(huì)有兩個(gè)問題:
不支持tinyint類型,在相關(guān)issues中,官方開發(fā)人員有回復(fù):
"Tiny integer" is not supported by many database vendors. DBAL"s type system is an abstraction layer for SQL types including type conversion from PHP to database value and back. I am assuming that your issue refers to MySQL, where we do not have a distinct native SQL type to use for BooleanType mapping. Therefore MySQL"s TINYINT is used for that purpose as is fits best from all available native types and in DBAL we do not have an abstraction for tiny integers as such (as mentioned above).What you can do is implement your own tiny integer custom type and tell DBAL to use column comments (for distinction from BooleanType in MySQL). That should work. See the documentation.
To tell DBAL to use column comments for the custom type, simply override the requiresSQLCommentHint() method to return true.
所以只能添加自定義類型。
另外一個(gè)問題,就是不支持enum類型。深入代碼之后,發(fā)現(xiàn)enum類型的特殊格式并不好融入到組件中去,自定義類型也不能支持,但是如果你是半途中加入數(shù)據(jù)遷移組件,現(xiàn)在項(xiàng)目中如果已經(jīng)有了數(shù)據(jù)表結(jié)構(gòu),且包含enum類型的字段,那么使用遷移組件是會(huì)報(bào)錯(cuò)。
那么,下一章我們就來完成這兩件事:添加tinyint的自定義類型,解決enum報(bào)錯(cuò)的問題。
在我的代碼庫可以查看這篇文章的詳細(xì)代碼,歡迎star。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28799.html
摘要:自定義根據(jù)官方文檔,新建類,集成,并重寫,,,等方法。如果集成遷移組件的時(shí)候數(shù)據(jù)庫里已經(jīng)存在表且有類型的字段,那么執(zhí)行遷移命令時(shí)就會(huì)報(bào)錯(cuò)。下一章我們來詳細(xì)研究如何集成方式的數(shù)據(jù)遷移組件。 自定義type 根據(jù)官方文檔,新建TinyIntType類,集成Type,并重寫getName,getSqlDeclaration,convertToPHPValue,getBindingType等方...
摘要:是基于組件的數(shù)據(jù)遷移組件。版本管理把數(shù)據(jù)庫變更寫入到代碼中,來進(jìn)行版本管理。此系列文章不討論現(xiàn)有框架中數(shù)據(jù)遷移組件的使用,而是著重于探討如何單獨(dú)使用遷移組件以及如何把數(shù)據(jù)遷移組件集成到自己的項(xiàng)目個(gè)性化定制。 場景分析 團(tuán)隊(duì)開發(fā)中,每個(gè)開發(fā)人員對于數(shù)據(jù)庫都修改都必須手動(dòng)記錄,上線時(shí)需要人工整理,運(yùn)維成本極高。而且在多個(gè)開發(fā)者之間數(shù)據(jù)結(jié)構(gòu)同步也是很大的問題。Doctrine Migrati...
摘要:安全生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫一個(gè)兼容標(biāo)準(zhǔn)的過濾器一個(gè)生成隨機(jī)數(shù)和字符串的庫使用生成隨機(jī)數(shù)的庫一個(gè)安全庫一個(gè)純安全通信庫一個(gè)簡單的鍵值加密存儲(chǔ)庫一個(gè)結(jié)構(gòu)化的安全層一個(gè)試驗(yàn)的面向?qū)ο蟮陌b庫一個(gè)掃描文件安全的庫 Security 安全 生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫 HTML Purifier-一個(gè)兼容標(biāo)準(zhǔn)的HTML過濾器 RandomLib-一個(gè)生成隨機(jī)數(shù)和字...
摘要:安全生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫一個(gè)兼容標(biāo)準(zhǔn)的過濾器一個(gè)生成隨機(jī)數(shù)和字符串的庫使用生成隨機(jī)數(shù)的庫一個(gè)安全庫一個(gè)純安全通信庫一個(gè)簡單的鍵值加密存儲(chǔ)庫一個(gè)結(jié)構(gòu)化的安全層一個(gè)試驗(yàn)的面向?qū)ο蟮陌b庫一個(gè)掃描文件安全的庫 Security 安全 生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫 HTML Purifier-一個(gè)兼容標(biāo)準(zhǔn)的HTML過濾器 RandomLib-一個(gè)生成隨機(jī)數(shù)和字...
閱讀 2574·2021-10-08 10:04
閱讀 2735·2021-09-06 15:02
閱讀 792·2019-08-30 13:50
閱讀 1547·2019-08-30 13:21
閱讀 2586·2019-08-30 11:15
閱讀 2113·2019-08-29 17:19
閱讀 1574·2019-08-26 13:55
閱讀 1261·2019-08-26 10:15