1

我想使用教义迁移生成数据库迁移脚本。

我的一个客户有 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 上使用?

4

1 回答 1

7

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 App\Migrations
    # 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文件中的环境变量来优化配置并且只有一个文件。

编辑:(我记得我已经更新了模块加载器以避免多次加载迁移配置文件,您可能必须将非sqlite教义_迁移配置文件移动到另一个目录而不是通常的目录)

于 2020-07-20T08:41:22.560 回答