news 2026/9/24 13:19:24

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/9/17 22:35:51

安全、高效、智能:RFID技术在工具管理与人员识别中的双效协同

在工业制造、建筑施工、医疗手术乃至航空航天等关键领域,工具的高效精准管理与人员的可靠身份识别,是保障安全、提升效率、控制成本的核心环节。传统依赖手工登记、目视检查或条码扫描的管理模式,日益暴露出效率低下、易出错、实时性差等痛点…

作者头像 李华
网站建设 2026/9/15 22:58:17

电机控制器FOC算法实现详解:从坐标变换讲起

从三相电流到转矩控制:FOC坐标变换的工程实现全解析 你有没有遇到过这样的情况?明明代码逻辑写得清清楚楚,PI参数也调得八九不离十,可电机一跑起来就是抖、效率上不去、噪音还特别大。排查半天发现——问题不在控制器本身&#xf…

作者头像 李华
网站建设 2026/9/22 9:23:48

YOLOv8眼科筛查:眼底图像病变区域识别与分级

YOLOv8眼科筛查:眼底图像病变区域识别与分级 在糖尿病患者逐年增长的今天,糖尿病视网膜病变(DR)已成为成年人致盲的主要原因之一。然而,在基层医疗机构中,专业眼科医生资源匮乏,大量患者难以获得…

作者头像 李华
网站建设 2026/9/24 11:09:45

多租户架构的安全 buff 原来要这么叠,这安全感谁懂啊!

多租户架构的安全优势,核心围绕 “数据隔离可控、权限精细管控、全链路安全防护、合规原生适配” 四大核心方向,结合 JNPF 多租户系统的技术特性,具体体现在以下几个方面: 分级数据隔离 从根源杜绝数据泄露这是多租户架构最核心…

作者头像 李华
网站建设 2026/9/8 17:28:50

终极指南:5分钟掌握云盘下载加速技巧

在这个信息爆炸的时代,你是否也曾面对百度网盘那令人绝望的下载速度?明明宽带速度跑满,下载进度条却像蜗牛爬行...今天,我要向你揭秘一个简单而强大的解决方案,让你彻底告别限速困扰! 【免费下载链接】baid…

作者头像 李华