如何避免PythonAnywhere部署的Django应用在git pull更新时数据库数据丢失?
嘿,这个问题我之前帮好几个开发者解决过——核心原因确实和你用SQLite有关,再加上git的配置没做好,才会每次pull都把录入的数据搞丢。咱们一步步来搞定:
第一步:立刻阻止数据继续丢失(紧急修复)
这一步先解决当前的git覆盖问题,避免下次pull再丢数据:
- 先检查你的git仓库是不是把
db.sqlite3纳入了跟踪。在PythonAnywhere的终端里执行:
如果看到git statusdb.sqlite3出现在变更列表或已跟踪文件里,那就是问题根源。 - 把数据库文件从git跟踪列表里移除,但不要删除本地文件(不然当前的现有数据也没了):
git rm --cached db.sqlite3 - 在项目根目录修改或创建
.gitignore文件,加上这一行,确保git永远不会再管这个文件:# .gitignore 新增内容 db.sqlite3 - 把
.gitignore的修改提交并推送到远程仓库:
做完这步,下次你再执行git add .gitignore git commit -m "不再跟踪SQLite数据库文件" git pushgit pull,git就不会覆盖你的本地数据库文件了。
第二步:为什么SQLite在PythonAnywhere生产环境容易出问题?
SQLite是文件型数据库,适合本地开发,但在PythonAnywhere这类生产环境有硬伤:
- 它是单文件存储,一旦不小心被git跟踪,就很容易被远程仓库的版本覆盖,就像你遇到的情况。
- PythonAnywhere的部署环境下,SQLite的并发性能差,一旦有多个用户同时访问,可能出现锁表、数据损坏的问题,稳定性远不如客户端-服务器型数据库。
第三步:长期解决方案——换成PythonAnywhere支持的生产级数据库
PythonAnywhere自带MySQL和PostgreSQL的支持,配置起来很简单,这里以MySQL为例:
- 在PythonAnywhere后台创建数据库
- 登录PythonAnywhere,进入「Databases」标签页。
- 点击「Create a new MySQL database」,填写数据库名、用户名(通常和你的PythonAnywhere用户名一致),设置密码。
- 修改Django的settings.py配置
找到DATABASES配置块,替换成MySQL的配置:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的用户名$数据库名', # 比如 dobbs760$my_personal_site_db 'USER': '你的用户名', 'PASSWORD': '你设置的数据库密码', 'HOST': '你的用户名.mysql.pythonanywhere-services.com', 'PORT': '3306', } } - 安装MySQL驱动
激活你的虚拟环境(如果用了的话),然后安装驱动:pip install mysqlclient - 迁移现有数据到新数据库
- 先备份当前SQLite的数据(以防万一):
python manage.py dumpdata > backup.json - 执行数据库迁移,创建新的表结构:
python manage.py migrate - 把备份的数据导入到MySQL数据库:
python manage.py loaddata backup.json
- 先备份当前SQLite的数据(以防万一):
- 验证并重启应用
重启PythonAnywhere上的web应用,访问网站确认数据都在,之后再做git pull测试,就不会再出现数据丢失的问题了。
额外提醒
- 不管是开发环境还是生产环境,一定要确保
db.sqlite3在.gitignore里,避免再次踩坑。 - 如果偏好PostgreSQL,配置逻辑和MySQL类似,只需把
ENGINE换成django.db.backends.postgresql_psycopg2,并安装psycopg2-binary驱动即可。
内容的提问来源于stack exchange,提问作者Dobbs760




