在验证和更新模式时,我很难让symfony/doctrine排除数据库视图。
我第一次尝试无原则迁移(见这个问题),但没有成功。
我发现,条令迁移会从验证/更新中过滤掉视图,事实上确实如此,所以这一步骤似乎适用于迁移。
因此,如果只有一个数据库原则,迁移会很好,但至少可以说,使用多个数据库的设置并不是干净的。
这是一个已知的问题,您可以在这个链接上看到。不幸的是,当试图遵循链接中描述的解决方案时,结果是混乱的。
尽管命令migration:update--em=default将指示设置了正确的数据库,但在生成migration:diff--em=default时,它将与其他数据库混合,同样与migration:migrate--em=default-混合,最终在其他数据库上创建表。
更具体地说,错误是:-它将为迁移文件创建单独的目录,如配置文件中所示,但不会创建到相应的em-它将生成混合了两个em的mysql查询-因此,它将更新数据库
我的设置如下:
配置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: AppDoctrineMigrationsDefault
table_name: migration_versions
name: Application_Migrations_Default
doctrine_migrations_used.yml
doctrine_migrations:
dir_name: "%kernel.root_dir%/DoctrineMigrationsUsed"
namespace: UsedDoctrineMigrationsUsed
table_name: migration_versions
name: Application Migrations Used
organize_migrations: false
这是它如何混合配置的一个例子。数据库名称正确。它对应于em=默认值。但其他信息来自em=使用的
感谢
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: UsedDoctrineMigrationsUsed
>> 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原则:迁移:状态--em=default--configuration=/app/config/doctrine_migrations_default.yml
它不会识别文件信息,即使当它直接从config.yml获取信息时会识别。会引发以下错误。
[DDoctrine\DBAL\Migrations\MigrationException]
迁移配置密钥"Doctrine_Migrations"不存在。
如果我取出docrine_migrations键,它将在遇到的下一个信息中生成错误。
您的各个配置文件实际上没有正确配置,这就是为什么您收到关于配置密钥不存在的错误。密钥与正常迁移配置中的密钥不同。我必须搜索代码才能找到正确的设置。(我在AbstractFileConfiguration.php文件的ln35附近找到了它们)
试试这些-
doctrine_migrations_default.yml
migrations_directory: "app/DoctrineMigrationsDefault"
migrations_namespace: AppDoctrineMigrationsDefault
table_name: migration_versions
name: Application_Migrations_Default
doctrine_migrations_used.yml
migrations_directory: "app/DoctrineMigrationsUsed"
migrations_namespace: UsedDoctrineMigrationsUsed
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"或提供完整路径。
留给未来参考:
doctrine_migrations_default.yaml和doctrine_migrations_used.yaml文件用于跨多个实体管理器执行迁移时使用的额外配置。
这些文件不应由symfony自动加载,您可以将它们直接放在config/下,而不是放在docrine_migrations.yaml所在的config/packages中。
我在symfony 5.0.4上测试了它,它运行得很好:
php bin/console doctrine:migrations:migrate --em=used --configuration=config/doctrine_migrations_used.yaml