Django 项目数据库迁移 + 旧数据导入

背景、问题与正确解决方案

随着项目的长期迭代,Django ORM 的字段结构会不断变化:

  • 某些字段被删除 / 重命名
  • 新字段被添加
  • 外键约束变化
  • 表结构由迁移文件自动维护

现在线上的旧数据库结构仍然停留在历史版本,它的字段与当前 Django 的模型不一致。

当我们要把旧数据库的数据迁移到最新 Django 版本时,就会面临:

  • 老库的字段结构和新库不一致
  • Django 的系统表(auth_*, django_migrations 等)在每个版本中都不同
  • 部分旧表在新版本中已不存在
  • 新版本 Django 期望由 migrations 自动创建表结构,而不是用旧 SQL 覆盖

从旧数据库导出sql,不包含表结构和django系统表和不存的表

因此,传统数据库迁移方法 完全行不通

传统方法为什么失败?

mysqldump 导出 SQL → mysql < sql 导入到新数据库 → 再 migrate 报错

arduino 复制代码
django.db.utils.OperationalError: (1054, "Unknown column 'xxx' in 'django_migrations'")

原因:表结构不一致导致 migrate 报错

  • 新 Django 模型删除了某个字段
  • 旧 SQL 仍然包含该字段
  • migrate 无法正确应用迁移,因为数据库结构被旧 SQL 覆盖了

先 migrate(数据库迁移)→ 再导入 SQL 报错

rust 复制代码
ERROR 1136 (21S01): Column count doesn't match value count at row 1

ERROR 1062 (23000): Duplicate entry '1' for key 'auth_permission.PRIMARY'

ERROR 1146 (42S02): Table 'new_db.xxx' doesn't exist

原因:数据结构不匹配、重复插入 Django 系统表,旧 SQL 包含 Django 系统表(auth_permission 等),旧 SQL 中存在新项目中已删除的表

正确解决方案(推荐)

由 Django 决定新结构(migrate),旧数据库只迁移业务数据(无结构)

  1. mysqldump导出旧数据库,不包含表结构,不导出 Django 系统表,新数据库没有的表,使用 --complete-insert 确保字段名对应
ini 复制代码
mysqldump -uroot -p old_db \
  -t --skip-triggers \
  --complete-insert \
  --ignore-table=old_db.auth_permission \
  --ignore-table=old_db.auth_group \
  --ignore-table=old_db.auth_group_permissions \
  --ignore-table=old_db.auth_user \
  --ignore-table=old_db.auth_user_groups \
  --ignore-table=old_db.auth_user_user_permissions \
  --ignore-table=old_db.django_content_type \
  --ignore-table=old_db.django_admin_log \
  --ignore-table=old_db.django_migrations \
  --ignore-table=old_db.django_session \
  --ignore-table=old_db.你的app_你的模型 \
  > data_only.sql
  1. 数据库迁移

    python manage.py migrate

这一过程由 Django 自动完成:

  • 创建最新结构
  • 添加新字段
  • 删除旧字段
  • 创建所有 Django 系统表
  • 维护外键约束
  1. 导入旧数据到新数据库
css 复制代码
mysql -uroot -p 新数据库 < data_only.sql
相关推荐
智购科技无人售货机工厂18 小时前
2026自动售货机触摸屏驱动开发:从I2C协议到多点触控校准的工程实践~YH
android·驱动开发·python·单片机·云原生·django
智购科技无人售货机厂家19 小时前
2026自动售货机远程运维平台设计:从设备诊断到预测性维护的工程实践~YH
运维·python·物联网·架构·django·scikit-learn
小蒜学长19 小时前
基于Django的社区团购购物平台的设计与实现(代码+数据库+LW)
数据库·后端·python·django
何以解忧,唯有..21 小时前
Django 框架入门指南:从零开始构建 Web 应用
前端·python·django
我的xiaodoujiao1 天前
Django 基础知识详细图文教程 1-Django 介绍
后端·python·学习·测试工具·django
Allen_LVyingbo1 天前
医疗AI可扩展网格信息系统中网格计算技术的智能优化
大数据·人工智能·python·算法·机器学习·django·健康医疗
会编程的吕洞宾2 天前
DeepAgents In Action学习(Third)
python·学习·django
FYKJ_20102 天前
django学习成绩预警系统10905
java·javascript·spring boot·python·spark·django·php
言乐63 天前
Python实现自动拉人脚本示例
开发语言·windows·python·django·pygame
践行见远4 天前
django之配置文件加载
django