我在努力让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键,它将在遇到的下一个信息时生成错误。
答案 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