我想使用原则迁移生成数据库迁移脚本。
我的一个客户有mysql数据库,另一个有mssql,我们在开发环境中使用sqlite。
如果我使用php artisan doctrine:migrations:diff
生成脚本,那么它将以以下行开始:
$this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on 'mysql'.');
如何根据实体类中的更改生成迁移脚本,使其也可以在mysql、sqlsrv和sqlite上使用?
您可以创建一个dev/doctrine.yml
文件,声明三个实体管理器(每个数据库引擎一个(,而不是在dev中只使用sqllite,如文档中所述。当然,您只能在开发文件中进行。不要更改生产配置文件。
然后,创建一个env变量来指定要在dev:中使用的默认orm
# config/packages/dev/doctrine.yaml
doctrine:
orm:
default_entity_manager: '%env(my_current_orm)%'
# ...
在这一步中,您现在只能通过更改环境变量来更改数据库服务器/引擎。
根据这个答案,您可以为每个数据库引擎创建一个doctrine_migration.yaml
文件。在这些文件中,您可以指定不同的子目录来存储迁移文件。
#example for mssql engine
doctrine_migrations:
dir_name: '%kernel.project_dir%/migrations/mssql'
# namespace is arbitrary but should be different from AppMigrations
# as migrations classes should NOT be autoloaded
namespace: DoctrineMigrations/MsSql/
在这一步中,您现在可以为每个数据库引擎启动迁移命令。
symfony console doctrine:migrations:status --em=mssql
--configuration=src/config/packages/dev/migrations/mssql.yml
正如您所看到的,对于迁移,我使用了而不是环境变量。我手动指定默认的orm--em=xxxx
,并指定配置文件。我在一个旧项目中使用过这个,但我认为现在可以使用doctrine_migration.yaml
文件中的环境变量来优化配置,并且只有一个文件。
edit:(我记得我已经更新了模块加载程序,以避免多次加载迁移配置文件,您可能需要将非sqlite doctrine_migration配置文件移动到另一个目录中,而不是通常的目录(