You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目Heroku Postgres数据库应用迁移失败如何解决?

Django Heroku 迁移不一致问题解决方案

根本原因

报错本质是Heroku数据库中django_migrations表的迁移记录、实际表结构、代码中的迁移文件三者状态不匹配:你之前恢复备份时把旧的django_migrations表也一起恢复了,导致系统认为已经应用过所有迁移,但实际表结构没有更新。


方案一:修复现有库迁移状态(优先推荐,无需移动数据)

操作步骤:

  • 第一步:确认本地所有迁移文件是最终正确版本,本地执行python manage.py migrate后结构和生产期望结构完全一致,将所有migrations目录下的文件提交到代码仓库并推送到Heroku。
  • 第二步:本地执行python manage.py showmigrations,记录每个应用(app1/app2/app3/app4/users)标记为[X]的最新迁移文件的编号+名称,例如users应用最新为0005_add_user_role。
  • 第三步:在Heroku端执行假迁移命令,仅更新迁移记录,不修改实际表结构:
    heroku run python manage.py migrate --fake <应用名> <最新迁移文件名前缀>
    
    示例:给users应用标记到0005版本:heroku run python manage.py migrate --fake users 0005,所有报错提到的应用都执行一次该命令。
  • 第四步:执行常规迁移命令验证:heroku run python manage.py migrate,此时不会再报未应用迁移的错误。

注意:执行假迁移前必须确认生产库实际表结构和最新迁移定义的结构完全一致,如果有差异,先手动执行ALTER TABLE语句调整生产表结构到匹配状态,再执行假迁移,避免后续迁移出现冲突。


方案二:仅迁移数据不覆盖库结构

如果你要走重置库再导数据的路线,按以下步骤操作避免覆盖结构和迁移记录:

  • 第一步:导出旧库仅数据内容,排除表结构和迁移记录表:
    pg_dump -a --exclude-table=django_migrations -d <旧数据库连接URL> -f data_only_dump.sql
    
    参数说明:-a表示仅导出数据不导表结构,--exclude-table排除迁移记录表避免旧迁移记录覆盖新库。
  • 第二步:重置Heroku数据库后,执行heroku run python manage.py migrate完成所有结构迁移,确认此时库结构是最新的无报错。
  • 第三步:将纯数据备份导入新库:
    psql -d <Heroku新数据库连接URL> -f data_only_dump.sql
    

导入前可以手动删除备份文件中django_content_type、auth_permission两个系统自动生成表的插入语句,避免主键冲突报错。


内容的提问来源于stack exchange,提问作者Efosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:24:03