團隊開發中,每一個開發人員對於數據庫都修改都必須手動記錄,上線時須要人工整理,運維成本極高。並且在多個開發者之間數據結構同步也是很大的問題。Doctrine Migrations
組件把數據庫變動加入到代碼中和代碼一塊兒進行版本管理,很好的解決了上述問題。php
Doctrine Migrations
是基於Doctrine DBAL
組件的數據遷移組件。集成於Laravel,Symfony等主流框架。大概能夠分爲兩種方式進行遷移,即版本管理方式和diff方式。html
版本管理:把數據庫變動寫入到代碼中,來進行版本管理。Laravel框架就是版本管理的模式,遷移組件默認的命令行就是支持這種模式。mysql
diff:把現有數據庫結構和代碼裏面的數據庫結構來作對比,執行差別的sql以保證一致性。通常須要ORM的支持,Symfony框架就是使用Doctrine2
ORM工具加上Doctrine DBAL
來進行diff方式的數據遷移。git
此係列文章不討論現有框架中數據遷移組件的使用,而是着重於探討如何單獨使用遷移組件以及如何把數據遷移組件集成到本身的項目、個性化定製。github
composer安裝sql
composer require doctrine/migrations ~1.8.0
本系列使用的是目前最新的1.8.1版本
安裝以後不能直接使用,還須要進行組件配置以及數據庫配置:數據庫
根目錄下創建migrations.php文件,配置組件:segmentfault
return [ 'name' => 'Doctrine Migrations', // 組件顯示名稱 'migrations_namespace' => 'db\migrations', // 遷移類的命名空間 'table_name' => 'migration_versions', // 遷移組件的表名 'migrations_directory' => 'db/migrations', // 遷移類的文件夾 ];
詳情的配置參數參見官方文檔。bash
根目錄下簡歷migrations-db.php文件,配置數據庫信息:數據結構
return [ 'driver' => 'pdo_mysql', 'host' => 'localhost', 'port' => 3306, 'user' => 'root', 'password' => '1236', 'dbname' => 'migrations', ];
到此,組件須要的配置已經完成。
運行vendor目錄下面的命令生成版本遷移類文件。
./vendor/bin/doctrine-migrations migrations:generate
在遷移類目錄/db/migrations下面生成Version20180608155932.php類文件,此文件便是用於寫入遷移sql的類,Version後面的數字則是當前版本號。
重寫up方法,用於執行遷移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']); }
這個腳本是生成一個test1的表。
重寫down方法,用於版本回退,撤銷up方法的遷移操做:
public function down(Schema $schema): void { if ($schema->hasTable('test1')) { $schema->dropTable('test1'); } }
執行遷移命令:
./vendor/bin/doctrine-migrations migrations:migrate
這樣就成功的建立了一個版本的遷移數據。遷移類腳本可使用$schema來操做數據庫實體,也可使用$this->addSql()方法來直接寫入相關的sql,詳細參加官方文檔對於腳本編寫的詳細說明,此處不過多展開。
既然遷移使用版本管理,那麼多個版本之間能夠來回切換。下面是相關的版本切換命令:
./vendor/bin/doctrine-migrations migrations:migrate 20180608161758
這條命令是恢復到20180608161758版本,除了直接輸入具體版本號以外,還有更加方便的版本別名:
# 生成遷移腳本 php migration.php migrations:generate # 執行遷移到最新版本 php migration.php migrations:migrate # --dry-run是空轉參數,只顯示操做結果,不執行修改 php migration.php migrations:migrate --dry-run # 不執行操做,只寫入文件,對於生產環境須要手動驗證並執行的場景有用 php migration.php migrations:migrate --write-sql=file.sql # 查看詳細信息 php migration.php status
到此,就學會了migrations組件的基本使用,可是還有以下幾個問題須要咱們解決:
下一章,咱們會解決以上問題,而且讓組件更個性化的融入到咱們本身的項目中去。
在 個人代碼庫能夠查看這篇文章的詳細代碼。