弃用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操作:
进入Shell后执行:python manage.py shellfrom 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
相关产品推荐
相关产品推荐

