PythonAnywhere拉取Git代码时避免数据库改动的方法咨询
解决PythonAnywhere拉取代码不改动数据库的方案
问题根源
拉取代码后数据库被清空,大概率是本地的SQLite数据库文件(db.sqlite3)被误推送到GitHub,拉取时直接覆盖了PythonAnywhere上的生产数据库;或是执行了重置类命令清空了数据。
具体解决方案
排除数据库文件版本控制
- 在本地项目根目录的
.gitignore文件中添加一行:db.sqlite3,确保本地数据库不会被纳入版本控制。 - 如果之前已经把数据库文件推送到GitHub,执行以下命令移除:
git rm --cached db.sqlite3 git commit -m "移除版本控制中的数据库文件" git push origin main
这样后续拉取代码时,PythonAnywhere上的生产数据库不会被覆盖。
- 在本地项目根目录的
拉取代码前先备份数据库
在PythonAnywhere的控制台操作时,先备份当前生产数据库:cp db.sqlite3 db.sqlite3.backup拉取代码后如果数据库异常,直接用备份恢复:
cp db.sqlite3.backup db.sqlite3规范数据库迁移流程
本地修改模型后,仅推送迁移文件,不要推送数据库文件:- 本地生成并执行迁移:
python manage.py makemigrations python manage.py migrate - 推送迁移文件到GitHub:
git add . git commit -m "添加模型迁移文件" git push origin main - 在PythonAnywhere上仅执行迁移命令,绝对不要用
flush或reset_db这类清空数据的命令:python manage.py migrate
- 本地生成并执行迁移:
长期优化:分离开发与生产数据库
开发环境用本地SQLite,生产环境改用PythonAnywhere提供的MySQL或PostgreSQL(更稳定,避免文件覆盖风险)。通过settings.py区分配置:import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent if os.environ.get('PRODUCTION'): # 生产环境数据库配置(以MySQL为例) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_username$your_db_name', 'USER': 'your_username', 'PASSWORD': 'your_db_password', 'HOST': 'your_username.mysql.pythonanywhere-services.com', } } else: # 开发环境SQLite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }在PythonAnywhere的环境变量中设置
PRODUCTION=1即可启用生产配置。
内容的提问来源于stack exchange,提问作者Clover
相关产品推荐
相关产品推荐

