如何使用多个db设置symfony 3 doctrine迁移?

时间:2017-10-19 08:35:41

标签: php symfony doctrine-orm doctrine-migrations

我在努力让symfony / doctrine在验证和更新架构时排除数据库视图。

我第一次尝试没有学说迁移(see this question)但是没有用。

我发现教条迁移会过滤掉验证/更新中的视图,实际上这样做了,因此该步骤似乎适用于迁移。

因此,如果一个只有一个数据库原则迁移将正常工作,但至少可以说,使用多个数据库的设置并不干净。

这是一个已知问题,您可以在this link上看到。不幸的是,当试图按照链接中描述的解决方案时,结果很混乱。

即使命令迁移:update --em = default也表示设置了正确的数据库,在生成迁移时:diff --em = default它将与其他db混合,同样与迁移混合:migrate --em = default,最终在另一个db上创建表。

更具体地说,错误是: - 它将为配置文件中指示的迁移文件创建单独的目录,但不会创建相应的em - 它会生成混合两个em的mysql查询 - 因此它将更新db

我的设置如下:

config.yml

imports:
....
- { resource: doctrine_migrations_default.yml }
- { resource: doctrine_migrations_used.yml }

doctrine:
  dbal:
    default_connection: default
    connections:
        default:      
            .....
            #schema_filter: "~^(?!view).*$~"
            schema_filter: ~^(?!view_)~
        used:
             ......

orm:
    auto_generate_proxy_classes: '%kernel.debug%'
    default_entity_manager: default
    entity_managers:
        default:
            naming_strategy: doctrine.orm.naming_strategy.underscore
            connection: default
            auto_mapping: true
            mappings:
                AppBundle:  ~
        used:
            naming_strategy: doctrine.orm.naming_strategy.underscore
            connection: used
            mappings:
                UsedBundle: ~ 

然后,迁移的特定配置文件是:

doctrine_migrations_default.yml

doctrine_migrations: 
        dir_name: "%kernel.root_dir%/DoctrineMigrationsDefault"
        namespace: App\DoctrineMigrationsDefault
        table_name: migration_versions
        name: Application_Migrations_Default 

doctrine_migrations_used.yml

doctrine_migrations:
    dir_name: "%kernel.root_dir%/DoctrineMigrationsUsed"
    namespace: Used\DoctrineMigrationsUsed
    table_name: migration_versions
    name: Application Migrations Used
    organize_migrations: false

这是它如何混合配置的一个例子。数据库名称是正确的。它对应于em = default。但其他信息来自em = used

由于

php bin/console doctrine:migrations:status --em=default

==配置

>> Name:                                               Application Migrations Used
>> Database Driver:                                    pdo_mysql
>> Database Name:                                      symfony_cars
>> Configuration Source:                               manually configured
>> Version Table Name:                                 migration_versions
>> Version Column Name:                                version
>> Migrations Namespace:                               Used\DoctrineMigrationsUsed
>> Migrations Directory:                               /Users/BAMAC/Sites/Symfony1/app/DoctrineMigrationsUsed
>> Previous Version:                                   Already at first version
>> Current Version:                                    0
>> Next Version:                                       2017-10-19 08:03:52 (20171019080352)
>> Latest Version:                                     2017-10-19 08:03:52 (20171019080352)
>> Executed Migrations:                                0
>> Executed Unavailable Migrations:                    0
>> Available Migrations:                               1
>> New Migrations:                                     1

另外,如果我尝试用以下方式专门指出配置文件:

  

php bin / console doctrine:migrations:status --em = default --configuration =。/ app / config / doctrine_migrations_default.yml

它不会识别文件信息,即使它直接从config.yml获取信息也是如此。抛出以下错误。

  

[学说\ DBAL \迁移\ MigrationException]
    迁移配置密钥" doctrine_migrations"不存在。

如果我取出doctrine_migrations键,它将在遇到的下一个信息时生成错误。

2 个答案:

答案 0 :(得分:1)

请勿在config.yml文件中导入迁移设置。

您的个人配置文件实际上未正确配置,这就是您收到有关配置密钥不存在的错误的原因。密钥与普通迁移配置中的密钥不同。我不得不搜索代码以找到正确的设置。 (我发现它们位于AbstractFileConfiguration.php file)的35左右

试试这些 -

doctrine_migrations_default.yml

migrations_directory: "app/DoctrineMigrationsDefault"
migrations_namespace: App\DoctrineMigrationsDefault
table_name: migration_versions
name: Application_Migrations_Default 

doctrine_migrations_used.yml

migrations_directory: "app/DoctrineMigrationsUsed"
migrations_namespace: Used\DoctrineMigrationsUsed
table_name: migration_versions
name: Application Migrations Used
organize_migrations: false #valid entries are false, 'year', and 'year_and_month'

doctrine_migrations,dir_name和namespace不是该配置文件的有效条目。

此外,您不能在目录路径中使用%kernel.root_dir%,但对我有用的是将其更改为“app”或提供完整路径。

答案 1 :(得分:1)

将此留作以后参考:

doctrine_migrations_default.yaml和doctrine_migrations_used.yaml文件用于在多个实体管理器之间执行迁移时使用的额外配置。

这些文件不应由symfony自动加载,您可以将它们直接放在config /下,而不是放在doctrine_migrations.yaml所在的config / packages下。

我在symfony 5.0.4上对其进行了测试,并且运行良好:

php bin/console doctrine:migrations:migrate --em=used --configuration=config/doctrine_migrations_used.yaml