如何在Symfony 3中使用Doctrine Migrations设置多个数据库?

5

我在使用symfony/doctrine时遇到了问题,无法在验证和更新schema时排除db视图。

刚开始我尝试不用doctrine migrations(参见此问题),但没成功。

后来我发现doctrine migrations会从验证/更新中过滤掉视图,并且实际上确实过滤掉了,因此使用migrations似乎可以解决这个问题。

所以,如果只有一个db,doctrine migrations就能正常工作,但是对于多个db的设置来说,情况则相当复杂。

正如您在此链接中所看到的那样,这是一个已知的问题。不幸的是,尝试按照链接中描述的解决方案操作结果比较混乱。

即使命令migrations:update --em=default指示正确的数据库设置已经完成,但生成migrations:diff --em=default时它将与其他db混合在一起,migrations: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获取信息,在这种情况下,它也无法识别文件信息。将抛出以下错误:

[Doctrine\DBAL\Migrations\MigrationException]
迁移配置密钥“doctrine_migrations”不存在。

如果我删除doctrine_migrations密钥,它会在遇到下一个信息时生成错误。

我曾经遇到并解决了类似的问题,可以参考这里 - olidem
2个回答

5
不要在config.yml文件中导入迁移设置。
您的个人配置文件实际上没有正确配置,这就是为什么会收到有关配置密钥不存在的错误。密钥与正常迁移配置中的密钥不同。我不得不搜索代码才能找到正确的设置。(我在AbstractFileConfiguration.php文件的ln35周围找到了它们)
尝试使用以下设置-

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',要么提供完整路径。


3
留下这些内容作为以后的参考:
doctrine_migrations_default.yaml和doctrine_migrations_used.yaml文件是用于在多个实体管理器之间执行迁移时使用的额外配置。
这些文件不应该被Symfony自动加载,您可以直接将它们放在config/下,而不是config/packages中的doctrine_migrations.yaml所在的位置。
我在Symfony 5.0.4上进行了测试,它完美地工作了: php bin/console doctrine:migrations:migrate --em=used --configuration=config/doctrine_migrations_used.yaml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接