FastAPI+SQLAlchemy部署到Heroku时数据库连接报错H10如何解决?
问题根因
Heroku抛出H10错误代表应用进程启动时异常崩溃,无法处理请求,你遇到的问题由以下两个常见原因导致:
- Heroku官方提供的PostgreSQL服务默认的
DATABASE_URL环境变量前缀为postgres://,但你使用的databases库、SQLAlchemy 1.4及以上版本要求PostgreSQL连接的协议前缀必须为postgresql://,协议不匹配直接导致数据库连接初始化失败,服务启动中断。 - Heroku云PostgreSQL要求公网连接必须开启SSL验证,你的本地环境没有该限制所以本地运行正常,部署后未配置SSL参数会导致数据库连接被拒绝,触发服务崩溃。
排查步骤
- 执行
heroku logs --app 你的应用名称 --tail查看完整运行日志,确认崩溃阶段是否抛出数据库连接相关的异常,比如Invalid postgresql URL、SSL connection required等报错信息。 - 执行
heroku config:get DATABASE_URL --app 你的应用名称,确认返回的连接字符串前缀是否为postgres://。
修复方案
你需要对拿到的DATABASE_URL做两层适配,再传入数据库初始化逻辑即可,修正后的代码如下:
import os import databases import sqlalchemy # 读取Heroku环境变量 raw_db_url = os.environ.get('DATABASE_URL') # 替换协议前缀 if raw_db_url.startswith('postgres://'): DATABASE_URL = raw_db_url.replace('postgres://', 'postgresql://', 1) else: DATABASE_URL = raw_db_url # 追加SSL配置 if 'sslmode' not in DATABASE_URL: if '?' not in DATABASE_URL: DATABASE_URL += '?sslmode=require' else: DATABASE_URL += '&sslmode=require' # 初始化数据库连接 database = databases.Database(DATABASE_URL) metadata = sqlalchemy.MetaData() engine = sqlalchemy.create_engine( DATABASE_URL, pool_size=3, max_overflow=0, echo=True )
修改配置后重新部署即可解决问题。
内容的提问来源于stack exchange,提问作者Gotey
相关产品推荐
相关产品推荐

