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

Git回退版本后Django migrate无变化问题求助

问题原因

Git回退代码后,数据库的django_migrations表仍保留着之前已应用的迁移记录,Django会认为这些迁移已经执行完毕。即使你生成了新的初始迁移文件(如0001_initial.py),但因表中已有同名迁移的应用记录,migrate会直接跳过执行,导致数据库结构仍停留在回退前的状态。

解决方法

一、优先方案:利用旧迁移文件回退(推荐)

如果Git回退后,main_app/migrations/目录下还保留着对应旧提交的迁移文件,直接用以下步骤同步数据库:

  1. 确认本地迁移文件与Git回退后的代码完全一致;
  2. 执行迁移回退命令,将数据库结构同步到目标迁移版本:
    python manage.py migrate main_app 0001
    
    (0001是目标迁移文件的前缀,比如对应0001_initial.py)
  3. 后续修改模型后,正常执行makemigrations和migrate即可。

二、旧迁移文件丢失时的处理方案

如果旧迁移文件已无法找回,只能生成新初始迁移,分两种场景操作:

场景1:不需要保留main_app表的数据

  1. 先备份数据库(必须操作,防止数据丢失):
    pg_dump -U 你的用户名 你的数据库名 > full_backup.sql
    
  2. 连接PostgreSQL数据库,删除main_app的迁移记录:
    DELETE FROM django_migrations WHERE app = 'main_app';
    
  3. 删除main_app相关的所有数据库表(注意外键依赖顺序,先删子表):
    DROP TABLE IF EXISTS main_app_comment;
    DROP TABLE IF EXISTS main_app_experience;
    DROP TABLE IF EXISTS main_app_resume;
    DROP TABLE IF EXISTS main_app_project;
    
  4. 执行迁移重新创建表:
    python manage.py migrate main_app
    

场景2:需要保留main_app表的数据

  1. 双重备份:
    # 备份整个数据库
    pg_dump -U 你的用户名 你的数据库名 > full_backup.sql
    # 单独备份main_app表的数据
    pg_dump -U 你的用户名 -a -t main_app_project -t main_app_resume -t main_app_experience -t main_app_comment 你的数据库名 > data_backup.sql
    
  2. 连接PostgreSQL数据库,删除main_app的迁移记录:
    DELETE FROM django_migrations WHERE app = 'main_app';
    
  3. 手动同步数据库结构与当前模型:
    • 对照models.py中的字段,逐个调整数据库表结构:
      -- 示例:删除多余字段
      ALTER TABLE main_app_project DROP COLUMN extra_field;
      -- 示例:添加缺失字段(允许为空)
      ALTER TABLE main_app_project ADD COLUMN new_field VARCHAR(255) NULL;
      -- 示例:修改字段类型
      ALTER TABLE main_app_project ALTER COLUMN old_field TYPE INTEGER;
      
  4. 标记迁移已应用(不修改数据库,仅同步Django迁移状态):
    python manage.py migrate main_app --fake
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:22:47