如何使用多个数据库设置 symfony 3 学说迁移?

Ber*_*rdA 5 php symfony doctrine-orm doctrine-migrations

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

我首先尝试不进行教条迁移(请参阅此问题),但这没有用。

我发现学说迁移会过滤掉验证/更新中的视图,而且确实如此,因此该步骤似乎适用于迁移。

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

这是一个已知问题,您可以在此链接中看到。不幸的是,当尝试遵循链接中描述的解决方案时,结果很混乱。

即使命令 migrations:update --em=default 将指示设置了正确的数据库,但在生成 migrations:diff --em=default 时,它将与其他数据库混合,同样与 migrates:migrate --em=default 混合,结束在另一个数据库上创建表。

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

我的设置如下:

配置.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: ~ 
Run Code Online (Sandbox Code Playgroud)

那么,迁移的具体配置文件为:

学说_migrations_default.yml

doctrine_migrations: 
        dir_name: "%kernel.root_dir%/DoctrineMigrationsDefault"
        namespace: App\DoctrineMigrationsDefault
        table_name: migration_versions
        name: Application_Migrations_Default 
Run Code Online (Sandbox Code Playgroud)

学说_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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

php bin/console doctrine:migrations:status --em=default
Run Code Online (Sandbox Code Playgroud)

== 配置

>> 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
Run Code Online (Sandbox Code Playgroud)

另外,如果我尝试使用以下命令专门指示配置文件:

php bin/console 学说:迁移:状态 --em=default --configuration=./app/config/doctrine_migrations_default.yml

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

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

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

bet*_*eta 5

不要在 config.yml 文件中导入迁移设置。

您的个人配置文件实际上并未正确配置,这就是您收到有关配置密钥不存在的错误的原因。这些键与正常迁移配置中的键不同。我必须搜索代码才能找到正确的设置。(我在AbstractFileConfiguration.php 文件的 ln35 附近找到了它们)

试试这些——

学说_migrations_default.yml

migrations_directory: "app/DoctrineMigrationsDefault"
migrations_namespace: App\DoctrineMigrationsDefault
table_name: migration_versions
name: Application_Migrations_Default 
Run Code Online (Sandbox Code Playgroud)

学说_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'
Run Code Online (Sandbox Code Playgroud)

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

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