Symfony5中如何配置Doctrine使migration_versions表用自定义Schema?
解决方案:将Doctrine迁移版本表指定到自定义Schema
1. 修改Doctrine Migrations配置,指定带Schema的表名
直接在table_storage的table_name字段中使用[自定义Schema].[迁移表名]的格式,覆盖原有配置:
doctrine_migrations: migrations_paths: 'DoctrineMigrations': '%kernel.project_dir%/migrations' storage: table_storage: # 格式:自定义Schema名 + 迁移表名 table_name: 'd_mkgo_planning.doctrine_migration_versions_planning' version_column_name: 'version' version_column_length: 192 executed_at_column_name: 'executed_at'
2. 确保自定义Schema存在
Doctrine Migrations不会自动创建Schema,需提前完成创建:
- 方式一:手动在Postgres中执行SQL
CREATE SCHEMA IF NOT EXISTS d_mkgo_planning; - 方式二:在第一个迁移类中添加创建逻辑
// migrations/VersionXXXXXXXXX.php public function up(Schema $schema): void { // 不存在则创建自定义Schema if (!$schema->hasNamespace('d_mkgo_planning')) { $schema->createNamespace('d_mkgo_planning'); } // 后续迁移逻辑... } public function down(Schema $schema): void { // 请勿在此删除Schema,避免误删业务数据 }
3. 验证迁移执行
执行迁移命令后,Doctrine会自动在指定Schema下生成迁移版本表,不再使用public Schema。每个微服务配置不同的Schema前缀,即可完全隔离各自的迁移记录,避免互相删除对方迁移表的问题。
补充说明
- 你已实现的
TableSchemaSubscriber监听器可正常处理实体的Schema归属,无需修改; - 确保每个微服务的
doctrine_migrations.storage.table_storage.table_name配置都使用专属Schema前缀(如服务A用schema_a.migration_versions,服务B用schema_b.migration_versions); - 确认数据库用户拥有创建Schema和表的权限。
内容的提问来源于stack exchange,提问作者Amrou rabti
相关产品推荐
相关产品推荐

