Django模型迁移指南:从命令用法到最佳实践
一、迁移的工作原理
Django 迁移系统本质上是一套数据库版本控制系统,它通过以下三个核心环节实现模型与数据库的同步
- 生成迁移文件:当模型发生变更时,
makemigrations命令会生成记录变更的 Python 脚本,存储在应用的migrations/目录下
your_app/
└── migrations/
├── 0001_initial.py # 初始迁移文件
└── 0002_auto_20250606_1006.py # 自动生成的迁移文件
- 应用迁移文件:运行
migrate命令会按顺序执行迁移文件,并通过数据库中的django_migrations表记录执行状态,确保每个迁移只被执行一次

- 回滚迁移操作:支持将数据库状态回滚到指定的历史版本,可通过指定迁移编号或
zero实现完全回滚
二、生成迁移文件:makemigrations
基本用法
修改模型后(比如添加字段、删除模型、修改字段类型等),使用以下命令生成迁移文件
# 为指定应用生成迁移
python manage.py makemigrations your_app_name
# 为所有应用生成迁移
python manage.py makemigrations
实用选项
预览迁移内容:不实际创建文件,仅查看变更内容
python manage.py makemigrations --dry-run
解决迁移冲突:多开发者协作时合并迁移历史
python manage.py makemigrations --merge
迁移文件解释
迁移文件是自动生成的 Python 脚本,通常位于每个 app 的 migrations/ 文件夹下
your_app/
└── migrations/
├── 0001_initial.py
└── 0002_auto_20250606_1006.py
文件主要内容包括
- 迁移依赖关系(
dependencies) - 操作列表(
operations):记录字段添加、删除、类型修改等具体变更
# 迁移文件示例
# Generated by Django 4.2.20 on 2025-07-15 08:22
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('myapp_system', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='systemnotifymessage',
name='user_id',
field=models.ForeignKey(db_column='user_id', db_comment='接收用户ID', db_constraint=False, help_text='接收用户ID', on_delete=django.db.models.deletion.DO_NOTHING, related_name='notify_messages', to=settings.AUTH_USER_MODEL),
),
]
三、应用迁移:migrate
基础用法
使用场景
- 第一次运行 Django 项目之前
- 修改了
models.py中的模型定义 - 添加了第三方 Django 应用
# 应用所有未执行的迁移
python manage.py migrate
# 仅应用指定应用的迁移
python manage.py migrate myapp
# 应用到指定版本的迁移
python manage.py migrate myapp 0001
特殊场景处理
初始化已有数据库:当数据库表结构已存在时,使用假造 - fake-initial` 选项跳过初始迁移
python manage.py migrate --fake-initial
查看迁移状态:检查哪些迁移已应用,哪些未应用
python manage.py showmigrations
四、遗留数据库集成:inspectdb
当需要将 Django 与遗留数据库集成时,inspectdb工具能帮我们自动生成模型代码,省去手动编写的麻烦。
基本用法
# 查看生成的模型代码
python manage.py inspectdb
# 将模型代码保存到文件
python manage.py inspectdb > my_models.py
# 为特定表生成模型
python manage.py inspectdb auth_user
注意事项
使用重定向生成文件时,默认编码可能为 UTF-16 LE,导致 Django 无法识别,解决方法有两种:
- 手动创建 Python 文件并复制内容
- 使用 VSCode 打开文件,通过 "选择编码" 功能重新保存为 UTF-8
五、迁移回滚
回滚前的准备工作
查看当前迁移状态
python manage.py showmigrations [app_name]
# 带 [X] 标记的表示已应用的迁移,例如:
myapp
[X] 0001_initial
[X] 0002_add_email_field
[X] 0003_add_age_field
回滚前务必备份数据库,以防意外发生
# MySQL 数据库备份示例
mysqldump -u username -p dbname > backup_before_rollback.sql
回滚操作方法
回滚到指定迁移版本
# 语法:python manage.py migrate [app_name] [迁移编号]
# 示例:将 myapp 应用回滚到 0001 版本
python manage.py migrate myapp 0001
完全回滚(清空所有迁移)
# 完全回滚 myapp 应用的所有迁移
python manage.py migrate myapp zero
回滚操作过程
- 检查目标迁移版本与当前版本的差异
- 自动生成反向 SQL 语句(基于迁移文件中的 operations)
- 执行反向操作并更新 django_migrations 表记录
- 不会删除迁移文件,只是标记其为未执行状态
六、最佳实践
- 每次模型变更后生成并测试迁移
- 迁移文件应纳入版本控制
- 生产环境执行迁移前先在测试环境验证
- 复杂变更建议分步骤进行,避免一次性大规模迁移
- 谨慎使用回滚操作,先在测试环境验证回滚流程,再操作生产环境
您正在阅读的是《Django从入门到实战》专栏!关注不迷路~
Django模型迁移指南:从命令用法到最佳实践的更多相关文章
- 结合异步模型,再次总结Netty多线程编码最佳实践
更多技术分享可关注我 前言 本文重点总结Netty多线程的一些编码最佳实践和注意事项,并且顺便对Netty的线程调度模型,和异步模型做了一个汇总.原文:结合异步模型,再次总结Netty多线程编码最 ...
- RESTful API 设计指南,RESTful API 设计最佳实践
RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...
- vue高级进阶( 三 ) 组件高级用法及最佳实践
vue高级进阶( 三 ) 组件高级用法及最佳实践 世界上有太多孤独的人害怕先踏出第一步. ---绿皮书 书接上回,上篇介绍了vue组件通信比较有代表性的几种方法,本篇主要讲述一下组件的高级用法和最 ...
- Django模型迁移提示版本不匹配解决办法
Django迁移模型时提示django.core.exceptions.ImproperlyConfigured:mysqlclient 1.3.7 or newer is required; you ...
- 当Django模型迁移时,报No migrations to apply 问题时
前言:当更改model时在次迁移是不是经常报此类错误,解决以下两点便可以更新成功 1. 删除修改模型对应的app应用下的migrations中的生成文件 2. 进入数据库,找到django_migra ...
- Ubuntu 14.4 Django模型迁移到数据库提示 LookupError: unknown encoding: utf8mb4 解决方法
由于数据库中需要存储emoji表情,因此需要mysql支持utf8mb4,参考前面的文章升级数据库. 但是由于服务器上面的python-mysqldb连接包版本为1.2.3不支持utf8mb4,因此报 ...
- 读<jquery 权威指南>[7]-性能优化与最佳实践
一.优化选择器执行速度 1. 优先使用ID选择器和标记选择器 使用选择器时应该首选ID选择器($("#id")),其次是标记选择器($("div")),最后再选 ...
- 以数字资产模型为核心驱动的一站式IoT数据分析实践
[摘要] 一个不会直播的云服务架构师,不是一个好的攻城狮! 在这个全民直播的时代 一个不会直播的云服务架构师 不是一个好的攻城狮 3月23日15:00-15:50,华为云IoT物联网数据分析服务架构师 ...
- django 模型中 class Meta 内 各种属性的用法
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.下面对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会相应数据库表的 ...
- Oracle JDK迁移指南
Oracle JDK迁移指南 https://docs.oracle.com/en/java/javase/11/migrate/index.html#JSMIG-GUID-C25E2B1D-6C24 ...
随机推荐
- 关于思源笔记与docker的部分问题
关于思源笔记 sevePath与思源 思源从版本1.9.8之后规定必须设置servePath绑定地址,即仅限指定地址访问. 比如,部署的时候设置的--servePath=127.0.0.1:6806, ...
- ISCC2025破阵夺旗赛三阶段Misc详解 By Alexander
ISCC2025破阵夺旗赛三阶段Misc详解 By Alexander 写在前面:十八天吃石终于结束了,第一次就让我见到了这个比赛有多么的构式,平台是构式的,睡一觉就1000解了,全是对flag的渴望 ...
- odoo备份数据库无法还原问题解决:Command 'pg_dump' not found.
背景景:ubuntu20.04 上用命令安装postgresql后,odoo备份数据库报如下错误 安装命令:sudo apt-get install postgresql 默认安装:14版本的pg 错 ...
- pytest.mark.parametrize 传参
pytest.mark.parametrize 是pytest用来参数化测试的一个装饰器,它允许你为测试函数或测试类提供多组参数list, 这样就可以使用每组参数执行测试函数或测试类,实现参数化驱动, ...
- CountDownLatch和FutureTask类使用方法解析
摘要:使用CountDownLatch和FutureTask解决主线程需要拿到多个子线程任务的执行结果之后再进行执行的问题. 综述 我们在工作中,经常遇到有些业务场景需要使用多线程异步执行任务,从 ...
- Hibernate Validator 提示javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
问题背景:Spring boot项目不想写诸多校验代码,避免代码既丑陋又繁琐,故使用hibernate validator校验参数的时候,但出现如下所示的的错误提示: javax.validation ...
- 深入理解Nginx-模块开发与架构解析(第2版)第二章
Nginx的配置 运行中Nginx进程间的关系 # 为什么产品环境下安装master-worker方式配置同时启动多个进程? - master进程不会对用户提供服务,只用于管理真正提供服务的worke ...
- 最快的流媒体服务器搭建 smart_rtmpd
说明 流媒体服务器是一个很专业的名词,对于圈外人来说,可能显得比较高深.但是日常应用中还是经常需要用到它,搭建流媒体服务器需要了解各种名词,系统,环境配置,使用方法,使用流程.这让很多圈外人感觉无从下 ...
- Tomcat基础学习
Tomcat简介 Tomcat是一个轻量级的web服务器,也称为web容器,servlet容器.(web服务器可以封装http协议,简化开发.还可以将web项目部署到服务器上,对外提供网上浏览.) T ...
- tkinter使用pyinstaller 打包报错,ModuleNotFoundError: No module named ‘babel.numbers‘
@ 目录 报错原因 解决办法 报错原因 导入的tkcalendar 包 中,模块名与原生的冲突 from tkcalendar import DateEntry 解决办法 打包时加入参数--hidde ...