必须确认三件事:数据库连接可用、迁移文件正确、执行上下文安全。需验证database_url指向生产库且用户具备create/alter权限,检查迁移文件up()含有效sql或schema操作,确保doctrine_migrations.yaml中transactional: true并加--env=prod、--no-interaction、--allow-no-migration执行。

在 Symfony 4 生产环境执行模型迁移前,不能直接运行 doctrine:migrations:migrate。必须确认三件事:数据库连接可用、迁移文件正确、执行上下文安全。
确认数据库连接指向生产库且权限足够
检查 .env 中的 DATABASE_URL 是否明确配置为生产数据库(如 MySQL 或 PostgreSQL),而非本地 SQLite 或测试库。该用户必须拥有 CREATE、ALTER、DROP 权限。运行以下命令验证连通性:
-
php bin/console doctrine:database:create --if-not-exists(对 MySQL/PostgreSQL 有效;SQLite 自动创建,跳过) -
php bin/console doctrine:query:sql "SELECT 1"确认能执行简单查询 - 检查
config/packages/doctrine.yaml中doctrine.dbal.url没有被硬编码覆盖(例如写死为sqlite://...)
确认迁移文件已生成且内容非空
运行 php bin/console make:migration 后,必须打开生成的 migrations/Version*.php 文件,逐行检查:
-
up()方法中是否包含至少一条$this->addSql()或$schema->createTable()调用 - 若为空,先执行
php bin/console doctrine:schema:update --dump-sql看是否有预期 SQL;没有则说明实体未被扫描到(检查@Entity注解、auto_mapping配置或debug:config doctrine输出) - 不要手动修改 SQL 字符串——改错会导致哈希校验失败,应删掉重生成
确认生产环境参数与事务保护已启用
部署时必须显式指定环境,并确保关键安全配置生效:
- 命令必须加
--env=prod,避免误用开发环境缓存或日志配置 - 检查
config/packages/doctrine_migrations.yaml中transactional: true(默认开启,但老项目可能被注释或设为false) - 上线命令需带
--no-interaction --allow-no-migration,防止 CI/CD 卡在交互提示 - 高危操作(如
DROP TABLE、TRUNCATE)不应出现在up()中,除非你完全掌控数据后果
确认迁移状态与目标版本一致
执行前运行 php bin/console doctrine:migrations:status,重点核对:
- Available migrations 列表是否包含你刚生成的版本号
- Executed migrations 是否不含该版本(即尚未执行)
- Latest version 是否是你期望升级到的目标版本
- 若显示
No migrations to execute,说明 Doctrine 认为结构已同步——此时要警惕是实体未加载,还是数据库已被手动改过











