在Heroku上执行Django migrate时遇到的数据库迁移问题
我完全懂你现在的头疼——本地改模型、跑迁移都顺顺当当,推到Heroku后执行migrate却没生效,数据库还报字段不存在的错。别慌,下面几个方法你可以挨个尝试:
1. 先确认迁移文件已经推到Heroku了
很多时候问题出在这儿:你改了模型生成了迁移文件,但忘了把这些migrations目录下的.py文件提交到Git仓库里,自然推到Heroku后服务器上根本没有对应的迁移文件,怎么可能执行成功?
先在本地检查:
git status
如果看到migrations目录下有未提交的文件,赶紧提交推送:
git add your_app/migrations/xxxx_xxxx.py # 替换成实际的迁移文件名 git commit -m "Add migration for fairness field" git push heroku main
之后再重新跑迁移命令:
heroku run python manage.py migrate
2. 明确指定应用执行迁移
有时候Heroku可能没自动识别到对应应用的迁移任务,你可以手动指定应用名称来执行:
heroku run python manage.py migrate your_app_name # 替换成你的Django应用名
3. 检查迁移历史,强制执行目标迁移
先看看Heroku上的迁移状态,确认你新增的迁移有没有被标记为已执行:
heroku run python manage.py showmigrations
如果目标迁移旁边没有打勾,说明根本没跑起来。你可以直接指定这个迁移文件来执行:
heroku run python manage.py migrate your_app_name 00xx_migration_name
这里的00xx_migration_name是你本地迁移文件的前缀(比如0005_add_fairness_field)。
4. 重置数据库(谨慎操作!)
要是前面的方法都不管用,而且你能接受数据丢失(或者已经做好备份了),可以考虑重置Heroku的数据库:
重要提醒:这个操作会清空数据库里的所有数据,一定要确认数据已经备份或者不重要再执行!
步骤如下:
- 先备份数据库(可选但强烈推荐):
heroku pg:backups:capture heroku pg:backups:download
- 重置数据库:
heroku pg:reset DATABASE_URL
- 重新执行全量迁移:
heroku run python manage.py migrate
- 如果之前备份了数据,可以再导入回去。
5. 查看Heroku日志找隐藏错误
如果迁移命令看起来执行成功了,但字段还是不存在,那就去看Heroku的日志,说不定有隐藏的错误没显示出来:
heroku logs --tail
搜索migrate相关的日志内容,可能会发现比如权限不足、迁移文件语法错误、数据库连接问题之类的细节。
另外别忘了检查你的Django配置,确保Heroku上用的是正确的PostgreSQL数据库配置,别不小心指向了本地的数据库。
内容的提问来源于stack exchange,提问作者Haluka Maier-Borst

