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

弃用Django迁移文件:存量大型项目重置迁移方案咨询

Django大型项目迁移重置最佳实践

针对你提到的迁移文件过多导致测试耗时增加的问题,完全可以通过归档旧迁移、生成新初始迁移的方式解决,这是这类场景下的标准优化方案,尤其适合几乎无需回滚迁移的项目。以下是具体执行流程:

前提确认

先确保本地代码中的Models与生产/测试数据库的Schema完全一致,避免生成的新迁移与实际数据库不匹配。可通过以下命令验证:

python manage.py makemigrations --check

如果命令无输出,说明Models与Schema同步,可继续操作。

1. 归档旧迁移文件

  • 在项目根目录创建归档目录,按app分类存放旧迁移:
    mkdir -p migrations_archive/your_app_name/
    
  • 将每个app下migrations/目录中除__init__.py外的所有文件移动到对应归档目录:
    mv your_app_name/migrations/*.py migrations_archive/your_app_name/
    # 保留__init__.py
    mv migrations_archive/your_app_name/__init__.py your_app_name/migrations/
    
  • 将归档文件提交到Git,保留历史记录:
    git add migrations_archive/
    git commit -m "Archive old migrations for reset"
    

2. 清理数据库迁移记录

Django通过django_migrations表追踪已执行的迁移,需要清空该表记录:

  • 直接通过数据库命令执行:
    DELETE FROM django_migrations;
    
  • 或使用Django Shell操作:
    python manage.py shell
    
    进入Shell后执行:
    from django.db import connection
    with connection.cursor() as cursor:
        cursor.execute("DELETE FROM django_migrations;")
    

3. 生成新的初始迁移

为所有app生成以0001_initial开头的全新初始迁移:

python manage.py makemigrations

如果只想针对特定app生成,可指定app名称:

python manage.py makemigrations your_app_name

4. 标记新迁移为已执行

由于数据库已经是当前Schema,无需实际执行迁移,只需让Django认为新迁移已完成:

python manage.py migrate --fake

针对单个app执行:

python manage.py migrate --fake your_app_name

5. 团队同步与部署注意事项

  • 所有开发人员需拉取最新代码,重复步骤2和4,重置本地数据库的迁移记录。
  • 部署到生产环境时,只需执行migrate --fake同步django_migrations表,无需实际执行迁移(生产数据库已是目标Schema)。
  • 后续如果需要回滚,仅能回滚到初始状态(migrate your_app_name zero),需谨慎操作,建议提前备份数据库。

验证

执行以下命令确认迁移状态正常:

# 检查是否有未生成的迁移
python manage.py makemigrations --check
# 检查迁移执行状态
python manage.py showmigrations

运行测试,确认测试启动时不再执行大量迁移,耗时明显降低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:55:10