Django 迁移系统本质上是一套数据库版本控制系统,它通过以下三个核心环节实现模型与数据库的同步
makemigrations
命令会生成记录变更的 Python 脚本,存储在应用的 migrations/
目录下your_app/
└── migrations/
├── 0001_initial.py # 初始迁移文件
└── 0002_auto_20250606_1006.py # 自动生成的迁移文件
migrate
命令会按顺序执行迁移文件,并通过数据库中的 django_migrations
表记录执行状态,确保每个迁移只被执行一次zero
实现完全回滚修改模型后(比如添加字段、删除模型、修改字段类型等),使用以下命令生成迁移文件
# 为指定应用生成迁移
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),
),
]
使用场景
models.py
中的模型定义# 应用所有未执行的迁移
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
当需要将 Django 与遗留数据库集成时,inspectdb
工具能帮我们自动生成模型代码,省去手动编写的麻烦。
# 查看生成的模型代码
python manage.py inspectdb
# 将模型代码保存到文件
python manage.py inspectdb > my_models.py
# 为特定表生成模型
python manage.py inspectdb auth_user
使用重定向生成文件时,默认编码可能为 UTF-16 LE
,导致 Django 无法识别,解决方法有两种:
查看当前迁移状态
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
您正在阅读的是《Django从入门到实战》专栏!关注不迷路~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。