Heroku频繁删除聊天机器人sqlite3数据库该如何解决?
Heroku SQLite数据库丢失问题解决方法
根本原因
Heroku的dyno采用临时文件系统设计,每次代码部署、dyno日常自动重启(每24小时至少1次)时,都会将文件系统重置为部署包的初始状态,和你的.gitignore配置无关,默认路径下的所有动态生成文件都会被清空,天然不支持持久化存储本地文件。
方案1:更换为官方推荐的持久化数据库服务(最优解)
直接使用Heroku自带的托管数据库替换SQLite,无需担心持久化问题,小型机器人可以用免费套餐:
- 进入你的Heroku应用管理页,打开「Resources」选项卡,搜索添加
Heroku Postgres插件,选择免费的Hobby Dev规格即可 - 插件安装完成后,Heroku会自动生成名为
DATABASE_URL的环境变量,存储数据库连接地址,可在「Settings」-「Config Vars」中查看 - 修改机器人代码,将SQLite连接逻辑替换为PostgreSQL连接,直接读取
DATABASE_URL环境变量作为连接地址,不要硬编码 - 微调SQL语句适配PostgreSQL语法,大部分基础增删改查操作无需修改,仅少部分特性语法(比如自增主键声明、日期函数)需要调整
方案2:挂载持久化存储卷保留SQLite文件
如果不想修改现有适配SQLite的代码,可以通过绑定持久化存储卷实现本地文件保留:
- 进入你的Heroku应用管理页,打开「Resources」选项卡,搜索添加
Heroku Volumes插件,创建最小规格的存储卷,将卷绑定到dyno的指定目录,比如/app/data - 修改机器人代码,将SQLite数据库文件的生成路径指定为刚才绑定的卷目录,比如
/app/data/bot.db - 重新部署代码即可,后续生成的数据库文件会存储在持久化卷中,部署、dyno重启都不会丢失
注意事项
不要尝试在Heroku默认的临时文件系统中存储任何需要持久化的内容,包括数据库文件、用户上传资源、本地日志等,无论怎么配置都无法长期保留。
内容的提问来源于stack exchange,提问作者Kwabena Yiadom
相关产品推荐
相关产品推荐

