Heroku部署otree SVO报数据库未就绪 重置无效如何解决
核心排查方向与对应操作
检查Procfile是否缺失release阶段迁移配置
绝大多数该类报错都是因为部署流程没有自动执行数据库迁移,仅手动重置数据库不会触发表结构创建。进入项目根目录打开Procfile,确保配置和下面一致,覆盖原有内容:release: otree migrate web: otree runserver 0.0.0.0:$PORT配置修改完成后提交代码重新推送到Heroku触发构建,
release字段配置的命令会在每次部署、重启dyno前自动执行,确保表结构和当前代码版本匹配。检查Python版本是否未显式锁定导致迁移静默失败
Heroku-18栈如果没有收到明确的版本指定,会默认拉取Python 3.6.x版本,和本地使用的Python 3.7、对应版本的oTree/SVO依赖不兼容,迁移过程会静默中断,不会抛出显性的构建失败提示。在项目根目录新建runtime.txt文件,写入Heroku-18支持的最高Python3.7版本号:python-3.7.13提交该文件后重新部署即可。
检查数据库配置是否被本地配置覆盖
打开项目下的settings.py文件,确认没有硬编码本地sqlite数据库路径,这类本地配置会覆盖Heroku自动注入的Postgres数据库连接参数,导致表要么建在临时文件系统中重启即丢失,要么因权限不足无法创建。可以执行heroku config:get DATABASE_URL确认Heroku侧数据库环境变量正常注入,数据库配置段优先读取该环境变量即可。按正确顺序执行数据库重置
完成上述配置修改并重新部署成功后,按以下顺序操作,避免时机错误导致重置无效:- 执行
heroku logs --tail查看实时构建日志,确认release阶段的otree migrate命令没有抛出依赖、字段相关报错 - 执行
heroku run otree resetdb --noinput触发数据库重置,全程观察命令行输出,确认所有模型表创建成功无报错 - 执行
heroku restart重启所有dyno,等待10秒后再访问页面
- 执行
注意:不要将本地运行生成的
db.sqlite3文件提交到Heroku代码仓库,Heroku文件系统为临时存储,dyno重启后所有非数据库服务存储的文件都会被清空,同时本地上传的sqlite表结构和线上Postgres环境、依赖版本不匹配也会触发该报错。
内容的提问来源于stack exchange,提问作者cris

