場景分析
團隊開發中,每個開發人員對於數據庫都修改都必須手動記錄,上線時需要人工整理,運維成本極高。而且在多個開發者之間數據結構同步也是很大的問題。Doctrine Migrations
組件把數據庫變更加入到代碼中和代碼一起進行版本管理,很好的解決了上述問題。
Doctrine Migrations
是基於Doctrine DBAL
組件的數據遷移組件。集成於Laravel,Symfony等主流框架。大概可以分爲兩種方式進行遷移,即版本管理方式和diff方式。
版本管理:把數據庫變更寫入到代碼中,來進行版本管理。Laravel框架就是版本管理的模式,遷移組件默認的命令行就是支持這種模式。
diff:把現有數據庫結構和代碼裏面的數據庫結構來做對比,執行差異的sql以保證一致性。一般需要ORM的支持,Symfony框架就是使用Doctrine2
ORM工具加上Doctrine DBAL
來進行diff方式的數據遷移。
此係列文章不討論現有框架中數據遷移組件的使用,而是着重於探討如何單獨使用遷移組件以及如何把數據遷移組件集成到自己的項目、個性化定製。
安裝
composer安裝
composer require doctrine/migrations ~1.8.0
本系列使用的是目前最新的1.8.1版本
配置
安裝之後不能直接使用,還需要進行組件配置以及數據庫配置:
-
根目錄下建立migrations.php文件,配置組件:
return [ 'name' => 'Doctrine Migrations', // 組件顯示名稱 'migrations_namespace' => 'db\migrations', // 遷移類的命名空間 'table_name' => 'migration_versions', // 遷移組件的表名 'migrations_directory' => 'db/migrations', // 遷移類的文件夾 ];
詳情的配置參數參見官方文檔。
-
根目錄下簡歷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版本,除了直接輸入具體版本號之外,還有更加方便的版本別名:
- first:回退到初始版本
- prev:回到上一個版本
- next:遷移到下一個版本
- latest:遷移到最新版本(和不加版本號效果一樣)
常用命令
# 生成遷移腳本
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組件的基本使用,但是還有如下幾個問題需要我們解決:
- 一般項目中都會有數據庫配置文件,如何讓組件公用項目中的配置文件?
- 現在遷移組件所需要的配置文件只能在根目錄,如何讓配置文件更合理的歸檔?
- 命令行又長又難記,如何簡單使用命令行?
下一章,我們會解決以上問題,並且讓組件更個性化的融入到我們自己的項目中去。
在我的代碼庫可以查看這篇文章的詳細代碼。