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 ...
随机推荐
- SSI注入
.stm,.shtm和.shtml后缀文件中可以如此执行命令 <!--#exec cmd="ls"-->
- #ifndef 、 #define 、#endif使用解释
在C语言程序代码里,看到了这么一段代码: #ifndef __WIFI_CONNECT_H_ #define __WIFI_CONNECT_H_ int WifiConnect(const char ...
- 线程池中execute和submit的区别?
简要回答 execute只能提交Runnable类型的任务,无返回值.submit既可以提交Runnable类型的任务,也可以提交Callable类型的任务,会有一个类型为Future的返回值,但当任 ...
- Mysql建表注意点
库名.表名.字段名必须使用小写字母,"_"分割.
- snmp总结二:MIB语法
snmp总结二:MIB语法 MIB(Management Information Base,管理信息库)是 MO(Managed Object 管理对象)定义的集合.MIB 文件是按照 ASN.1 定 ...
- hot100之哈希
两数之和(001) 先看代码 class Solution { HashMap<Integer, Integer> map = new HashMap<>(); public ...
- 一文读懂HyperWorks的耦合求解功能
Altair Engineering, Inc. 是世界领先的工程设计技术开发者,同时,也是一家具有全球深厚工程技术底蕴的优秀CAE工程咨询公司.Altair公司在CAE建模.有限元分析.可视化.结构 ...
- 01windows环境配置
Windows Verilog开发环境配置指南 本指南将详细介绍如何在Windows系统上搭建完整的Verilog开发和仿真环境,包括iverilog.gtkwave.vvp和make工具的安装与配置 ...
- java ‘方法’简解
status 1.静态变量要定义在方法之外 2.静态变量与静态方法都是在类从磁盘加载至内存后被创建的,与类同时存在,同时消亡. 3.静态变量又称类的成员变量,在类中是全局变量,可以被类的所有方法调用 ...
- MindManager:将excel转成思维导图
当被要求把一个excel的内容转成思维导图的时,我讨要了很长的时间,使得有更多时间进行摸鱼,来完成本篇博客. 一:excel格式 绝不能使用合并单元格的方式,有合并的地方需要拆分,这是因为合并单元格后 ...