Django 1.11删除迁移后如何导出数据库并复用数据
在Django 1.11中重置Migrations并复用现有数据的完整流程
在Django 1.11里重置migrations同时保留业务数据这个需求挺常见的,我帮你梳理一套靠谱的操作流程,一步步来就不会出错:
步骤1:导出现有数据库数据
首先得把当前的业务数据导出来,用Django自带的dumpdata命令就很方便,它能把数据转成JSON格式(也支持其他格式),后续导入也省心:
- 运行命令:
为啥要排除这两个呢?因为python manage.py dumpdata --exclude auth.permission --exclude contenttypes > data.jsonauth.permission和contenttypes是Django自动维护的系统数据,重新初始化项目后它们会自动生成,要是一起导进去反而容易引发冲突。如果你的项目里还有其他不需要导出的模型(比如测试用的临时模型),也可以用--exclude app_name.model_name来添加排除项。 - 要是你的数据里有复杂的外键或关联关系,建议加上
--natural-foreign和--natural-primary参数,能更好地保留数据的完整性:python manage.py dumpdata --exclude auth.permission --exclude contenttypes --natural-foreign --natural-primary > data.json
步骤2:清理Migrations文件和数据库迁移记录
接下来要彻底清理旧的migrations相关内容:
- 删除项目中的migrations文件:
- 遍历每个app的
migrations文件夹,删除里面除了__init__.py之外的所有文件(要是__init__.py也删了也没关系,后续makemigrations会自动重建)。
- 遍历每个app的
- 清空数据库中的迁移记录表:
- 你可以通过数据库客户端直接执行SQL,比如PostgreSQL/MySQL都可以用:
DELETE FROM django_migrations; - 或者用Django shell来操作:
然后执行:python manage.py shellfrom django.db import connection with connection.cursor() as cursor: cursor.execute("DELETE FROM django_migrations;")
- 你可以通过数据库客户端直接执行SQL,比如PostgreSQL/MySQL都可以用:
- 可选:完全重置数据库(如果有脏数据需要清理):
- 要是你的数据库里有残留的脏数据,或者想彻底从头开始,可以用
python manage.py flush清空所有表的数据(保留表结构);或者直接删除数据库再重新创建(比如PostgreSQL用dropdb+createdb,MySQL用DROP DATABASE+CREATE DATABASE)。
- 要是你的数据库里有残留的脏数据,或者想彻底从头开始,可以用
步骤3:重新生成初始迁移并同步数据库
现在可以重新创建migrations并同步到数据库了:
- 为所有app生成初始迁移文件:
这个命令会为每个app生成python manage.py makemigrations0001_initial.py这样的初始迁移文件,相当于重新开始记录模型变更。 - 同步数据库:
这里的python manage.py migrate --fake-initial--fake-initial很关键!如果你的数据库还保留着之前的表结构(没删库的话),用这个参数能让Django“假装”已经执行过初始迁移,避免因为表已存在而报错。要是你是完全新建的数据库,直接用python manage.py migrate就行。
步骤4:导入之前导出的数据
最后把备份的数据导回去就行:
- 运行命令:
python manage.py loaddata data.jsonloaddata会自动识别JSON文件里的模型数据,把它们导入到对应的数据库表中。如果导入时遇到外键关联的错误,可以检查一下导出时有没有加--natural-foreign参数,或者确认导入的模型顺序是否合理(不过loaddata一般会自动处理关联依赖)。
重要注意事项
- 一定要备份! 操作前最好备份整个数据库和项目文件,万一出问题还能回滚。
- 如果你用了第三方app,也要确保它们的migrations也被正确清理,大部分第三方app按上面的流程处理就没问题,但少数特殊的可能需要参考它们的文档。
- 导出数据时,仔细检查
--exclude的内容,别把需要的业务模型排除掉了。
内容的提问来源于stack exchange,提问作者Philip Mutua
相关产品推荐
相关产品推荐

