Django模型遷移指南:從命令用法到最佳實(shí)踐
一、遷移的工作原理
Django 遷移系統(tǒng)本質(zhì)上是一套數(shù)據(jù)庫版本控制系統(tǒng),它通過以下三個(gè)核心環(huán)節(jié)實(shí)現(xiàn)模型與數(shù)據(jù)庫的同步
- 生成遷移文件:當(dāng)模型發(fā)生變更時(shí),
makemigrations命令會(huì)生成記錄變更的 Python 腳本,存儲在應(yīng)用的migrations/目錄下
your_app/
└── migrations/
├── 0001_initial.py # 初始遷移文件
└── 0002_auto_20250606_1006.py # 自動(dòng)生成的遷移文件
- 應(yīng)用遷移文件:運(yùn)行
migrate命令會(huì)按順序執(zhí)行遷移文件,并通過數(shù)據(jù)庫中的django_migrations表記錄執(zhí)行狀態(tài),確保每個(gè)遷移只被執(zhí)行一次

- 回滾遷移操作:支持將數(shù)據(jù)庫狀態(tài)回滾到指定的歷史版本,可通過指定遷移編號或
zero實(shí)現(xiàn)完全回滾
二、生成遷移文件:makemigrations
基本用法
修改模型后(比如添加字段、刪除模型、修改字段類型等),使用以下命令生成遷移文件
# 為指定應(yīng)用生成遷移
python manage.py makemigrations your_app_name
# 為所有應(yīng)用生成遷移
python manage.py makemigrations
實(shí)用選項(xiàng)
預(yù)覽遷移內(nèi)容:不實(shí)際創(chuàng)建文件,僅查看變更內(nèi)容
python manage.py makemigrations --dry-run
解決遷移沖突:多開發(fā)者協(xié)作時(shí)合并遷移歷史
python manage.py makemigrations --merge
遷移文件解釋
遷移文件是自動(dòng)生成的 Python 腳本,通常位于每個(gè) app 的 migrations/ 文件夾下
your_app/
└── migrations/
├── 0001_initial.py
└── 0002_auto_20250606_1006.py
文件主要內(nèi)容包括
- 遷移依賴關(guān)系(
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),
),
]
三、應(yīng)用遷移:migrate
基礎(chǔ)用法
使用場景
- 第一次運(yùn)行 Django 項(xiàng)目之前
- 修改了
models.py中的模型定義 - 添加了第三方 Django 應(yīng)用
# 應(yīng)用所有未執(zhí)行的遷移
python manage.py migrate
# 僅應(yīng)用指定應(yīng)用的遷移
python manage.py migrate myapp
# 應(yīng)用到指定版本的遷移
python manage.py migrate myapp 0001
特殊場景處理
初始化已有數(shù)據(jù)庫:當(dāng)數(shù)據(jù)庫表結(jié)構(gòu)已存在時(shí),使用假造 - fake-initial` 選項(xiàng)跳過初始遷移
python manage.py migrate --fake-initial
查看遷移狀態(tài):檢查哪些遷移已應(yīng)用,哪些未應(yīng)用
python manage.py showmigrations
四、遺留數(shù)據(jù)庫集成:inspectdb
當(dāng)需要將 Django 與遺留數(shù)據(jù)庫集成時(shí),inspectdb工具能幫我們自動(dòng)生成模型代碼,省去手動(dòng)編寫的麻煩。
基本用法
# 查看生成的模型代碼
python manage.py inspectdb
# 將模型代碼保存到文件
python manage.py inspectdb > my_models.py
# 為特定表生成模型
python manage.py inspectdb auth_user
注意事項(xiàng)
使用重定向生成文件時(shí),默認(rèn)編碼可能為 UTF-16 LE,導(dǎo)致 Django 無法識別,解決方法有兩種:
- 手動(dòng)創(chuàng)建 Python 文件并復(fù)制內(nèi)容
- 使用 VSCode 打開文件,通過 "選擇編碼" 功能重新保存為 UTF-8
五、遷移回滾
回滾前的準(zhǔn)備工作
查看當(dāng)前遷移狀態(tài)
python manage.py showmigrations [app_name]
# 帶 [X] 標(biāo)記的表示已應(yīng)用的遷移,例如:
myapp
[X] 0001_initial
[X] 0002_add_email_field
[X] 0003_add_age_field
回滾前務(wù)必備份數(shù)據(jù)庫,以防意外發(fā)生
# MySQL 數(shù)據(jù)庫備份示例
mysqldump -u username -p dbname > backup_before_rollback.sql
回滾操作方法
回滾到指定遷移版本
# 語法:python manage.py migrate [app_name] [遷移編號]
# 示例:將 myapp 應(yīng)用回滾到 0001 版本
python manage.py migrate myapp 0001
完全回滾(清空所有遷移)
# 完全回滾 myapp 應(yīng)用的所有遷移
python manage.py migrate myapp zero
回滾操作過程
- 檢查目標(biāo)遷移版本與當(dāng)前版本的差異
- 自動(dòng)生成反向 SQL 語句(基于遷移文件中的 operations)
- 執(zhí)行反向操作并更新 django_migrations 表記錄
- 不會(huì)刪除遷移文件,只是標(biāo)記其為未執(zhí)行狀態(tài)
六、最佳實(shí)踐
- 每次模型變更后生成并測試遷移
- 遷移文件應(yīng)納入版本控制
- 生產(chǎn)環(huán)境執(zhí)行遷移前先在測試環(huán)境驗(yàn)證
- 復(fù)雜變更建議分步驟進(jìn)行,避免一次性大規(guī)模遷移
- 謹(jǐn)慎使用回滾操作,先在測試環(huán)境驗(yàn)證回滾流程,再操作生產(chǎn)環(huán)境
您正在閱讀的是《Django從入門到實(shí)戰(zhàn)》專欄!關(guān)注不迷路~

Django遷移系統(tǒng)是數(shù)據(jù)庫版本控制工具,通過生成遷移文件、應(yīng)用遷移和回滾操作,實(shí)現(xiàn)模型與數(shù)據(jù)庫結(jié)構(gòu)的同步。支持遷移生成、應(yīng)用、沖突解決及遺留數(shù)據(jù)庫集成,確保開發(fā)過程中的數(shù)據(jù)模型一致性與靈活性。
浙公網(wǎng)安備 33010602011771號