当前位置: 首页 > news >正文

Django模型迁移指南:从命令用法到最佳实践

文章目录

    • 一、迁移的工作原理
    • 二、生成迁移文件:makemigrations
      • 基本用法
      • 实用选项
      • 迁移文件解释
    • 三、应用迁移:migrate
      • 基础用法
      • 特殊场景处理
    • 四、遗留数据库集成:inspectdb
      • 基本用法
      • 注意事项
    • 五、迁移回滚
      • 回滚前的准备工作
      • 回滚操作方法
      • 回滚操作过程
    • 六、最佳实践


一、迁移的工作原理

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:22from django.conf import settings
from django.db import migrations, models
import django.db.models.deletionclass 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从入门到实战》专栏!关注不迷路~

http://www.lryc.cn/news/605630.html

相关文章:

  • HttpServletRequest详细解释
  • 如何在NPM上发布自己的React组件(包)
  • 人工智能概念之十一:常见的激活函数与参数初始化
  • Cesium 快速入门(四)相机控制完全指南
  • langchain--1--prompt、output格式、LCEL示例
  • 【烧脑算法】Dijkstra 算法:解决最短路问题
  • 会议室预定系统核心技术:如何用一行SQL解决时间冲突检测难题
  • LLC电源原边MOS管DS增加RC吸收对ZVS的影响分析
  • ode with me是idea中用来干嘛的插件
  • 山东移动云主机:技术架构与特性解析
  • AI 安监系统:为工业园安全保驾护航
  • 1 机器学习概述 (第一天2025.7.31)
  • RabbitMQ 队列配置设置 RabbitMQ 消息监听器的并发消费者数量java
  • Java 大视界 -- Java 大数据在智能医疗远程健康监测与疾病预防预警中的应用(374)
  • Linux 进程管理与计划任务
  • linux git ssh配置过程
  • React中的this绑定
  • SpringMVC的核心架构与请求处理流程
  • PostgreSQL dblink 与 Spring Boot @Transactional 的事务整合
  • 网络层概述
  • AngularJS 事件
  • Web 开发 08
  • 智慧社区项目开发(四)——前后端登录认证相关功能实现解析
  • 网关 + MDC 过滤器方案,5分钟集成 日志 traceid
  • Gemini Fullstack LangGraph Quickstart(DeepSeek+Tavily版本)
  • 智慧园区通行效率↑68%!陌讯多模态融合算法的实战解析
  • 【Cpolar实现内网穿透】
  • 转码刷 LeetCode 笔记[1]:3.无重复字符的最长子串(python)
  • 解决宇道项目关于接收日期格式yyyy-MM-dd HH:mm:ss后端自动转为1970-01-01 00:00:00的问题
  • 计算机网络——UDP