基础迁移命令大全
命令 | 作用 | 示例 | 说明 |
---|---|---|---|
python manage.py makemigrations |
自动检测模型变更并生成迁移文件 | - | 会扫描所有已注册的 app |
python manage.py makemigrations app_name |
只为指定 app 生成迁移文件 | makemigrations system |
✅ 推荐用于模块化项目 |
python manage.py migrate |
执行所有迁移文件,更新数据库结构 | - | 会同步所有 app 的迁移 |
python manage.py migrate app_name |
只迁移某个 app 的变更 | migrate users |
常用于局部调试或回滚 |
python manage.py migrate app_name migration_name |
迁移到某个版本 | migrate users 0003 |
可用于回滚或版本锁定 |
python manage.py showmigrations |
查看所有迁移状态 | - | ✅ 已应用的前面有 X ,未应用为空 |
python manage.py sqlmigrate app_name migration_name |
查看某个迁移的 SQL 语句 | sqlmigrate users 0002 |
不执行,只展示 SQL |
高级迁移技巧
创建空迁移(用于手动写逻辑)
python manage.py makemigrations --empty app_name
适合写 RunSQL
、RunPython
、数据迁移等。
回滚迁移(慎用)
python manage.py migrate app_name zero
会删除该 app 所有迁移记录和表结构。
指定数据库(多数据库场景)
python manage.py migrate --database=your_db_alias
适用于 DATABASES
中配置了多个数据库。
清理并重建数据库(开发阶段)
# 删除 SQLite 数据库
rm db.sqlite3
# 删除所有迁移文件(保留 __init__.py)
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
# 重新生成迁移
python manage.py makemigrations
python manage.py migrate
常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
修改模型但迁移文件没变化 | 没有实际字段变更 | 检查字段定义是否真的变化 |
migrate 报错字段已存在 | 数据库已有字段 | 手动编辑迁移文件或使用 RunSQL |
多人协作迁移冲突 | 同时修改模型 | 合并迁移文件或统一命名规范 |
删除字段后 migrate 报错 | 有依赖或外键约束 | 拆分迁移步骤,先解除约束再删除字段 |
企业级推荐实践
-
每个 app 单独执行
makemigrations app_name
,保持迁移清晰 -
每次迁移前执行
sqlmigrate
检查 SQL 语句 -
所有迁移文件都应提交到 Git,避免协作冲突
-
生产环境迁移前务必备份数据库
-
对于复杂变更,建议拆分为多个迁移文件逐步执行