部署更新Django代码时DigitalOcean托管PostgreSQL数据库自动重置如何解决?
Django on DigitalOcean 自动部署后数据库重置解决方案
核心根因
DigitalOcean 托管服务本身不会主动重置 PostgreSQL 数据库内容,所有数据清空都是部署流程中执行的数据库操作导致的,这类问题90%以上和migration管理不规范、部署钩子配置错误有关。
排查与修复步骤
- 第一步:先备份现有数据,避免后续操作再次丢失数据
执行数据库备份命令:pg_dump -h <你的DO数据库主机地址> -p <端口> -U <数据库用户名> -d <数据库名> > prod_backup.sql - 第二步:修正migration管理逻辑,禁止随意删除历史migration文件
删除所有migration文件的操作是直接诱因:- 恢复上一版正常运行的代码,找回所有历史migration文件,确保本地存储的migration记录和生产库中
django_migrations表的记录完全一致。 - 后续开发过程中的表结构变更,一律通过
python manage.py makemigrations生成新的增量migration文件,随代码提交,禁止删除已应用到生产环境的历史migration。
- 恢复上一版正常运行的代码,找回所有历史migration文件,确保本地存储的migration记录和生产库中
- 第三步:检查部署配置,移除危险操作
打开DigitalOcean对应应用的部署配置,找到「部署钩子/Deploy Hook」「运行命令/Run Command」配置项:- 仅保留
python manage.py migrate作为部署后的数据库操作命令,删除所有flush、reset_db、loaddata(未确认不会覆盖现有数据的前提下)、migrate --fake-initial之类的命令。 - 如果使用Gitlab CI,同步检查
.gitlab-ci.yml中的部署脚本,确认没有自动执行数据库重置、覆盖的命令。
- 仅保留
- 第四步:验证修复效果
把备份的数据库数据导回生产库,提交一个无业务影响的测试变更触发自动部署,确认部署完成后数据没有丢失、表结构正常。
DO默认的Django部署模板只会自动执行migrate命令,只要管理好migration文件、没有配置额外的危险操作,不会出现自动清空数据库的问题。
内容的提问来源于stack exchange,提问作者Floflodea
相关产品推荐
相关产品推荐

