Django 迁移中会删除数据的危险命令及操作
在 Django 迁移系统中,以下命令和操作会直接或间接删除数据库表数据,属于高风险操作,在生产环境中必须谨慎使用:
1. 会删除数据的迁移命令
直接删除数据的命令
-
migrate zero
(回滚所有迁移)bashpython manage.py migrate app_name zero
→ 会删除指定应用的所有表及其数据(按迁移反向操作)
-
flush
(清空数据库)bashpython manage.py flush
→ 删除所有表中的所有数据(保留表结构)
危险组合命令
-
reset_db
(Django-extensions 提供)bashpython manage.py reset_db
→ 完全重置数据库(删除所有表和数据)
安全操作建议
-
必须执行的预防措施:
bash# 执行前先备份数据库 python manage.py dumpdata > backup.json # 或使用数据库原生工具 pg_dump mydb > backup.sql
-
替代方案:
- 使用软删除(添加
is_deleted
字段)而非物理删除 - 先归档数据再执行删除操作
- 使用
db_table
重命名而非删除表
- 使用软删除(添加
-
检查迁移影响:
bash# 查看将执行的SQL(不实际执行) python manage.py sqlmigrate app_name migration_number # 查看迁移计划 python manage.py migrate --plan
-
生产环境操作流程:
- 在测试环境验证迁移
- 备份生产数据库
- 在维护窗口期执行
- 准备回滚方案
- 监控执行过程
重要提醒:任何包含 DeleteModel
、RemoveField
或 RunPython
/RunSQL
中有删除操作的迁移文件,都应视为高风险迁移,必须经过严格审查才能在生产环境执行。