news 2026/6/6 15:05:44

Django 迁移系统全指南:从模型到数据库的魔法之路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Django 迁移系统全指南:从模型到数据库的魔法之路

Django 迁移系统全指南:从模型到数据库的魔法之路

前言

你是否曾经遇到过这样的困扰:写好了一个 Python 的models.py文件,却发现不知道怎么在数据库中创建对应的表?或者修改了模型定义后,手动去数据库改表结构改得焦头烂额?

别担心,Django 的迁移系统就是为了解决这个问题而生的!今天我们就来深入了解一下这个强大的工具。


一、什么是 Django 迁移系统?

Django 迁移系统是一个自动化的数据库版本控制系统,它可以:

  • 📊自动检测模型变化
  • 📝生成迁移文件记录变化历史
  • 🚀自动执行 SQL来更新数据库

简单来说,你只需要写 Python 代码,剩下的事情 Django 都帮你搞定!


二、核心概念:两个命令

2.1python manage.py makemigrations- 施工图纸

这个命令负责检测模型变化生成迁移文件

# apps/students/models.pyclassStudent(models.Model):name=models.CharField(max_length=100)age=models.IntegerField()# 假设这是我们新增的字段

运行命令后:

$ python manage.py makemigrations Migrationsfor'students':apps/students/migrations/0002_add_age_field.py - Add field age to student

Django 会在apps/students/migrations/目录下生成一个新的 Python 文件:

# 0002_add_age_field.pyfromdjango.dbimportmigrations,modelsclassMigration(migrations.Migration):dependencies=[('students','0001_initial'),]operations=[migrations.AddField(model_name='student',name='age',field=models.IntegerField(),),]

⚠️ 注意:这个命令不会修改数据库,它只是准备了"施工图纸"。


2.2python manage.py migrate- 真正施工

这个命令负责执行迁移文件修改数据库

$ python manage.py migrate Running migrations: Applying students.0002_add_age_field... OK

Django 会读取刚才生成的迁移文件,执行相应的 SQL:

ALTERTABLEstudents_studentADDCOLUMNageINT;

并且会在django_migrations表中记录这个迁移已经被应用,防止重复执行。


三、两者的关系

可以用一个简单的类比来理解:

┌─────────────────────────────────────────────────────────┐ │ makemigrations = 编写施工图纸 │ │ (检测模型变化,生成迁移文件) │ └──────────────────────┬──────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────┐ │ migrate = 按照图纸施工 │ │ (执行 SQL,修改数据库) │ └─────────────────────────────────────────────────────────┘

四、完整的工作流程

场景:为学生表添加性别字段

第一步:修改模型
# apps/students/models.pyclassStudent(models.Model):name=models.CharField(max_length=100,verbose_name='姓名')age=models.IntegerField(verbose_name='年龄')gender=models.CharField(max_length=10,choices=[('male','男'),('female','女')],default='male',verbose_name='性别')# 新增字段
第二步:生成迁移文件
$ python manage.py makemigrations Migrationsfor'students':apps/students/migrations/0003_add_gender_field.py - Add field gender to student
第三步:应用迁移
$ python manage.py migrate Running migrations: Applying students.0003_add_gender_field... OK
第四步:查看结果
mysql>DESCRIBEstudents_student;+-------+--------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------+--------------+------+-----+---------+----------------+|id|bigint|NO|PRI|NULL|auto_increment||name|varchar(100)|NO||NULL|||age|int|NO||NULL|||gender|varchar(10)|NO||male||+-------+--------------+------+-----+---------+----------------+

搞定!数据库表已经自动更新了!


五、Django 会自动做什么?

✅ Django ORM 自动处理的:

操作示例生成的 SQL
创建表创建Student模型CREATE TABLE
添加字段新增gender字段ALTER TABLE ADD COLUMN
修改字段修改name字段长度ALTER TABLE MODIFY COLUMN
删除字段删除age字段ALTER TABLE DROP COLUMN
创建索引index=TrueCREATE INDEX
外键关系ForeignKeyFOREIGN KEY
多对多ManyToManyField自动创建中间表

❌ Django 不会做的:

  • 创建数据库本身(需要手动执行CREATE DATABASE
  • 删除数据库
  • 数据库的备份和恢复

六、典型场景示例

场景 1:项目初始化

# 1. 创建数据库(手动做一次)mysql-uroot-pCREATE DATABASE myproject CHARACTER SET utf8mb4;exit;# 2. 配置 settings.pyDATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'myproject','USER':'root','PASSWORD':'password','HOST':'localhost','PORT':'3306',}}# 3. 运行迁移(创建所有表)python manage.py migrate

场景 2:开发过程中修改模型

# 修改 models.py 后python manage.py makemigrations# 检测变化python manage.py migrate# 应用到数据库

场景 3:团队协作

# 同事 A 修改了模型并提交代码gitpull# 同事 B 拉取代码后python manage.py makemigrations# 检查是否有新迁移python manage.py migrate# 应用迁移

七、常见问题与解决方案

Q1: 如果数据库表已经存在怎么办?

情况 1:表是通过 SQL 手动创建的

# 先创建空迁移(不执行 SQL)python manage.py makemigrations--empty# 然后标记为已应用(告诉 Django 表已存在)python manage.py migrate--fake

情况 2:数据库为空,直接运行迁移

python manage.py migrate

Q2: 如何查看迁移历史?

# 查看所有迁移python manage.py showmigrations# 查看某个应用的迁移python manage.py showmigrations students# 查看迁移将执行的 SQL(不实际执行)python manage.py sqlmigrate students 0002

Q3: 如何撤销迁移?

# 撤销最后一次迁移(未应用)python manage.py migrate students 0001# 删除迁移文件(未应用)rmapps/students/migrations/0002_add_age_field.py

Q4: 迁移冲突怎么办?

当多人同时修改同一个模型时可能出现冲突:

# 1. 创建新的迁移解决冲突python manage.py makemigrations--merge# 2. 应用迁移python manage.py migrate

八、最佳实践

✅ 推荐做法:

  1. 每次修改模型后立即运行迁移

    python manage.py makemigrations&&python manage.py migrate
  2. 将迁移文件纳入版本控制

    gitaddapps/*/migrations/*.pygitcommit-m"Add age field to Student"
  3. 不要手动修改迁移文件

    • 迁移文件由 Django 自动生成和依赖
    • 手动修改可能导致问题
  4. 生产环境部署前先在测试环境验证

    # 测试环境python manage.py migrate--plan# 查看将要执行的操作

❌ 避免的做法:

  1. 不要直接修改数据库表结构
  2. 不要删除已应用的迁移文件
  3. 不要在生产环境运行makemigrations

九、总结对比表

特性makemigrationsmigrate
作用检测模型变化,生成迁移文件执行迁移,修改数据库
修改数据库❌ 不修改✅ 执行 SQL
产生文件✅ 生成.py文件❌ 不产生文件
何时使用修改models.py生成迁移文件后
执行次数每次修改模型每次有新迁移
可以撤销可以删除未应用的迁移可以回退到之前的版本

十、进阶技巧

1. 查看迁移计划(不执行)

python manage.py migrate--plan

2. 只运行特定应用的迁移

python manage.py migrate students

3. 回退到指定迁移

python manage.py migrate students 0001

4. 生成空的迁移(用于自定义操作)

python manage.py makemigrations--emptystudents

结语

Django 的迁移系统是一个强大而优雅的数据库管理工具,它让开发者能够专注于业务逻辑,而不是繁琐的 SQL 操作。

记住这两个命令:

python manage.py makemigrations# 检测变化,生成迁移文件python manage.py migrate# 应用迁移,修改数据库

就这么简单!🎉


相关资源:

  • Django 官方文档 - 迁移
  • Django 官方文档 - 操作

希望这篇博客能帮助你理解 Django 的迁移系统!如果还有疑问,欢迎留言讨论!💬

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 9:32:23

vivado2018.3破解安装教程在学术论文中的引用合规性讨论

当我们在论文中引用“Vivado破解教程”时,我们到底在支持什么? 你有没有在写FPGA相关论文时,悄悄地把某个“ vivado2018.3破解安装教程 ”的链接放进参考文献里? 或者,在方法部分轻描淡写地说一句:“实…

作者头像 李华
网站建设 2026/5/29 7:00:59

YOLOv8是否支持YOLOv11?未来版本预测与讨论

YOLOv8是否支持YOLOv11?未来版本预测与讨论 在深度学习领域,尤其是计算机视觉方向,目标检测模型的演进速度令人目不暇接。每当一个新版本发布,社区中总会迅速出现关于“下一代”的猜测——比如最近频繁被提及的“YOLOv11”。这种命…

作者头像 李华
网站建设 2026/5/22 9:06:30

Synaptics pointing device driver的probe流程全面讲解

深入Linux触控板驱动:Synaptics设备的probe机制全解析你有没有遇到过这样的情况——笔记本开机后,鼠标指针动不了,但外接USB鼠标却正常?或者系统识别出了触控板,却无法实现双指滚动?这类问题背后&#xff0…

作者头像 李华
网站建设 2026/5/24 4:55:13

批量部署CP2102驱动的企业级解决方案项目应用

如何让5000台设备自动认出同一个串口芯片?——企业级CP2102驱动批量部署实战在一家智能制造工厂的自动化产线上,工程师小李正面对一个看似简单却令人头疼的问题:新到货的300台PLC控制器需要接入MES系统进行固件烧录。每台设备都通过一个小小的…

作者头像 李华
网站建设 2026/5/14 1:06:39

YOLO家族新成员登场:YOLOv8算法特性全面解析

YOLOv8:从算法革新到工程落地的完整实践路径 在智能摄像头遍布街头巷尾、自动驾驶车辆逐步上路的今天,目标检测早已不再是实验室里的概念游戏,而是真实影响着交通调度、安防预警和工业自动化的关键技术。面对复杂多变的实际场景——密集人群中…

作者头像 李华
网站建设 2026/5/30 11:09:06

YOLOv8目标检测实战:在Linux系统中使用Git下载并运行Demo

YOLOv8目标检测实战:在Linux系统中使用Git下载并运行Demo 在智能摄像头、自动驾驶和工业质检日益普及的今天,如何快速搭建一个高效的目标检测开发环境,成了许多工程师面临的首要问题。传统方式下,安装PyTorch、配置CUDA驱动、解决…

作者头像 李华