Symfony 4 中 Doctrine Migrations 默认操作 default 连接,要针对特定数据库需配置多连接并在命令中显式指定 --connection=xxx(如 legacy),同时确保 doctrine_migrations.yaml 中 connection 配置一致或通过 --em 指定对应 EntityManager。

Symfony 4 中的 Doctrine Migrations 默认操作的是当前配置的默认数据库连接(即 doctrine.dbal.default_connection 对应的连接)。若要让迁移只针对某个特定数据库执行,核心思路是:**切换 Doctrine 使用的数据库连接配置,并确保该连接指向目标数据库**。
1. 配置多个数据库连接
在 config/packages/doctrine.yaml 中定义多个 DBAL 连接:
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(resolve:DATABASE_URL)%'
legacy:
url: '%env(resolve:DATABASE_LEGACY_URL)%'
# 其他参数如 driver, host, dbname 等可按需补充
确保环境变量 DATABASE_LEGACY_URL 已正确定义(例如 mysql://user:pass@localhost/legacy_db)。
2. 为特定连接生成和运行迁移
Doctrine 命令支持 --connection 选项,指定使用哪个连接:
- 生成迁移(针对
legacy数据库):php bin/console doctrine:migrations:generate --connection=legacy - 执行迁移(仅作用于
legacy数据库):php bin/console doctrine:migrations:migrate --connection=legacy - 查看待执行的迁移版本:
php bin/console doctrine:migrations:status --connection=legacy
3. 确保实体映射与连接匹配(可选但重要)
Doctrine 默认将所有实体映射到 default 连接。若某些实体只属于 legacy 数据库,需显式指定其使用的连接:
在实体类上用 @ORM\Entity 的 connection 属性(需 Doctrine ORM ≥ 2.7):
/**
* @ORM\Entity(connection="legacy")
* @ORM\Table(name="legacy_users")
*/
class LegacyUser { ... }
或在 doctrine.orm.entity_managers 配置中为不同连接定义独立的 EntityManager,并分配对应映射:
doctrine:
orm:
entity_managers:
default:
connection: default
mappings:
App:
is_bundle: false
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
legacy_em:
connection: legacy
mappings:
Legacy:
is_bundle: false
dir: '%kernel.project_dir%/src/Entity/Legacy'
prefix: 'App\Entity\Legacy'
这样,legacy_em 对应的迁移命令也需指定 EM:php bin/console doctrine:migrations:migrate --em=legacy_em --connection=legacy
4. 注意迁移配置文件的连接绑定
检查 doctrine_migrations.yaml 中是否硬编码了连接名:
doctrine_migrations:
migrations_paths:
DoctrineMigrations: '%kernel.project_dir%/migrations'
# connection 可显式指定,避免依赖默认值
connection: legacy
若此处设为 legacy,则所有迁移命令(除非显式覆盖)都会作用于该连接。
不复杂但容易忽略:关键在于命令行显式传入 --connection=xxx,并确保对应连接在 DBAL 配置中存在且可访问。


















