You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何避免PythonAnywhere部署的Django应用在git pull更新时数据库数据丢失?

嘿,这个问题我之前帮好几个开发者解决过——核心原因确实和你用SQLite有关,再加上git的配置没做好,才会每次pull都把录入的数据搞丢。咱们一步步来搞定:

第一步:立刻阻止数据继续丢失(紧急修复)

这一步先解决当前的git覆盖问题,避免下次pull再丢数据:

  • 先检查你的git仓库是不是把db.sqlite3纳入了跟踪。在PythonAnywhere的终端里执行:
    git status
    
    如果看到db.sqlite3出现在变更列表或已跟踪文件里,那就是问题根源。
  • 把数据库文件从git跟踪列表里移除,但不要删除本地文件(不然当前的现有数据也没了):
    git rm --cached db.sqlite3
    
  • 在项目根目录修改或创建.gitignore文件,加上这一行,确保git永远不会再管这个文件:
    # .gitignore 新增内容
    db.sqlite3
    
  • .gitignore的修改提交并推送到远程仓库:
    git add .gitignore
    git commit -m "不再跟踪SQLite数据库文件"
    git push
    
    做完这步,下次你再执行git pull,git就不会覆盖你的本地数据库文件了。
第二步:为什么SQLite在PythonAnywhere生产环境容易出问题?

SQLite是文件型数据库,适合本地开发,但在PythonAnywhere这类生产环境有硬伤:

  • 它是单文件存储,一旦不小心被git跟踪,就很容易被远程仓库的版本覆盖,就像你遇到的情况。
  • PythonAnywhere的部署环境下,SQLite的并发性能差,一旦有多个用户同时访问,可能出现锁表、数据损坏的问题,稳定性远不如客户端-服务器型数据库。
第三步:长期解决方案——换成PythonAnywhere支持的生产级数据库

PythonAnywhere自带MySQL和PostgreSQL的支持,配置起来很简单,这里以MySQL为例:

  1. 在PythonAnywhere后台创建数据库
    • 登录PythonAnywhere,进入「Databases」标签页。
    • 点击「Create a new MySQL database」,填写数据库名、用户名(通常和你的PythonAnywhere用户名一致),设置密码。
  2. 修改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',
        }
    }
    
  3. 安装MySQL驱动
    激活你的虚拟环境(如果用了的话),然后安装驱动:
    pip install mysqlclient
    
  4. 迁移现有数据到新数据库
    • 先备份当前SQLite的数据(以防万一):
      python manage.py dumpdata > backup.json
      
    • 执行数据库迁移,创建新的表结构:
      python manage.py migrate
      
    • 把备份的数据导入到MySQL数据库:
      python manage.py loaddata backup.json
      
  5. 验证并重启应用
    重启PythonAnywhere上的web应用,访问网站确认数据都在,之后再做git pull测试,就不会再出现数据丢失的问题了。
额外提醒
  • 不管是开发环境还是生产环境,一定要确保db.sqlite3.gitignore里,避免再次踩坑。
  • 如果偏好PostgreSQL,配置逻辑和MySQL类似,只需把ENGINE换成django.db.backends.postgresql_psycopg2,并安装psycopg2-binary驱动即可。

内容的提问来源于stack exchange,提问作者Dobbs760

火山引擎 最新活动