SpringBoot旅游信息管理系统源码解析:从拆包到跑通的最小闭环
2026/10/7 14:49:45
你是否曾经遇到过这样的困扰:写好了一个 Python 的models.py文件,却发现不知道怎么在数据库中创建对应的表?或者修改了模型定义后,手动去数据库改表结构改得焦头烂额?
别担心,Django 的迁移系统就是为了解决这个问题而生的!今天我们就来深入了解一下这个强大的工具。
Django 迁移系统是一个自动化的数据库版本控制系统,它可以:
简单来说,你只需要写 Python 代码,剩下的事情 Django 都帮你搞定!
python 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 studentDjango 会在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(),),]⚠️ 注意:这个命令不会修改数据库,它只是准备了"施工图纸"。
python manage.py migrate- 真正施工这个命令负责执行迁移文件并修改数据库。
$ python manage.py migrate Running migrations: Applying students.0002_add_age_field... OKDjango 会读取刚才生成的迁移文件,执行相应的 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... OKmysql>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||+-------+--------------+------+-----+---------+----------------+搞定!数据库表已经自动更新了!
| 操作 | 示例 | 生成的 SQL |
|---|---|---|
| 创建表 | 创建Student模型 | CREATE TABLE |
| 添加字段 | 新增gender字段 | ALTER TABLE ADD COLUMN |
| 修改字段 | 修改name字段长度 | ALTER TABLE MODIFY COLUMN |
| 删除字段 | 删除age字段 | ALTER TABLE DROP COLUMN |
| 创建索引 | index=True | CREATE INDEX |
| 外键关系 | ForeignKey | FOREIGN KEY |
| 多对多 | ManyToManyField | 自动创建中间表 |
CREATE DATABASE)# 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# 修改 models.py 后python manage.py makemigrations# 检测变化python manage.py migrate# 应用到数据库# 同事 A 修改了模型并提交代码gitpull# 同事 B 拉取代码后python manage.py makemigrations# 检查是否有新迁移python manage.py migrate# 应用迁移情况 1:表是通过 SQL 手动创建的
# 先创建空迁移(不执行 SQL)python manage.py makemigrations--empty# 然后标记为已应用(告诉 Django 表已存在)python manage.py migrate--fake情况 2:数据库为空,直接运行迁移
python manage.py migrate# 查看所有迁移python manage.py showmigrations# 查看某个应用的迁移python manage.py showmigrations students# 查看迁移将执行的 SQL(不实际执行)python manage.py sqlmigrate students 0002# 撤销最后一次迁移(未应用)python manage.py migrate students 0001# 删除迁移文件(未应用)rmapps/students/migrations/0002_add_age_field.py当多人同时修改同一个模型时可能出现冲突:
# 1. 创建新的迁移解决冲突python manage.py makemigrations--merge# 2. 应用迁移python manage.py migrate每次修改模型后立即运行迁移
python manage.py makemigrations&&python manage.py migrate将迁移文件纳入版本控制
gitaddapps/*/migrations/*.pygitcommit-m"Add age field to Student"不要手动修改迁移文件
生产环境部署前先在测试环境验证
# 测试环境python manage.py migrate--plan# 查看将要执行的操作makemigrations| 特性 | makemigrations | migrate |
|---|---|---|
| 作用 | 检测模型变化,生成迁移文件 | 执行迁移,修改数据库 |
| 修改数据库 | ❌ 不修改 | ✅ 执行 SQL |
| 产生文件 | ✅ 生成.py文件 | ❌ 不产生文件 |
| 何时使用 | 修改models.py后 | 生成迁移文件后 |
| 执行次数 | 每次修改模型 | 每次有新迁移 |
| 可以撤销 | 可以删除未应用的迁移 | 可以回退到之前的版本 |
python manage.py migrate--planpython manage.py migrate studentspython manage.py migrate students 0001python manage.py makemigrations--emptystudentsDjango 的迁移系统是一个强大而优雅的数据库管理工具,它让开发者能够专注于业务逻辑,而不是繁琐的 SQL 操作。
记住这两个命令:
python manage.py makemigrations# 检测变化,生成迁移文件python manage.py migrate# 应用迁移,修改数据库就这么简单!🎉
相关资源:
希望这篇博客能帮助你理解 Django 的迁移系统!如果还有疑问,欢迎留言讨论!💬