symfony 4 多数据库项目中,doctrine 迁移需显式指定 --connection 参数(如 --connection=legacy)才能作用于非默认数据库连接,否则仅操作 default 连接;各连接拥有独立的迁移表和实体管理器配置。

在 Symfony 4 多数据库项目中,模型迁移(Doctrine Migrations)默认只作用于 default 连接(即 doctrine.dbal.default_connection 配置的连接)。若要为**特定数据库连接**生成或执行迁移,需显式指定连接名,不能依赖默认行为。
1. 确保多数据库连接已正确定义
在 config/packages/doctrine.yaml 中,应已配置多个 DBAL 连接,例如:
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(DATABASE_URL)%'
legacy:
url: '%env(DATABASE_URL_LEGACY)%'
reporting:
url: '%env(DATABASE_URL_REPORTING)%'
每个连接都有唯一名称(如 legacy、reporting),后续迁移命令需引用这些名称。
2. 为指定连接生成迁移文件
使用 --em(Entity Manager)参数配合自定义 EM 配置,或更直接地用 --connection 参数(Doctrine >= 2.7 + Symfony DoctrineBundle >= 2.2 支持):
- 生成针对
legacy连接的迁移:
php bin/console doctrine:migrations:diff --connection=legacy
- 该命令会扫描绑定到
legacy连接的 Entity Manager(需确保doctrine.orm.legacy_entity_manager已配置并映射了对应实体) - 若未定义专用 EM,需先在
doctrine.yaml中为该连接声明 EM:
doctrine:
orm:
default_entity_manager: default
entity_managers:
default: ~
legacy:
connection: legacy
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Legacy'
prefix: 'App\Entity\Legacy'
3. 执行/回滚指定连接的迁移
所有迁移运行类命令均支持 --connection:
- 执行
legacy连接的待迁移:
php bin/console doctrine:migrations:migrate --connection=legacy
- 回滚一步(仅限
legacy):
php bin/console doctrine:migrations:rollback --connection=legacy
- 查看
reporting连接的迁移状态:
php bin/console doctrine:migrations:status --connection=reporting
4. 注意事项与常见问题
迁移表(doctrine_migration_versions)是按连接隔离的 —— 每个数据库会拥有自己的迁移记录表,互不影响。
- 确保每个连接的
doctrine_migrations.table_name配置不冲突(默认均为doctrine_migration_versions,但因库不同,实际无冲突) - 若使用
multiple_connections: true模式(不推荐),需手动管理各连接的 migrations 配置目录,易出错 - 实体必须正确绑定到目标连接的 Entity Manager,否则
diff不会识别其 schema 变更 - 运行前建议加
--dry-run预览 SQL:
php bin/console doctrine:migrations:diff --connection=legacy --dry-run











