You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:09:03