如何解决DigitalOcean上FastAPI与PostgreSQL的连接问题
排查FastAPI连接DigitalOcean托管PostgreSQL失败问题
首先明确:你遇到的socket.gaierror: [Errno -2] Name or service not known错误本质是数据库主机名解析失败,和SSL证书无关——你之前查到的SSL相关信息是误导方向。
下面是具体排查步骤:
确认DB_HOST环境变量是否正确
你删除了原Primary数据库后,新恢复的数据库集群的主机地址已经变更。请检查Docker容器内的DB_HOST环境变量值:- 进入容器执行:
docker exec -it 2a7b5654b16b echo $DB_HOST - 对比DigitalOcean控制台中新数据库集群的主机名(格式通常为
db-postgresql-xxx-xxxx-do-user-xxxxxx-0.b.db.ondigitalocean.com),确认是否还在使用已删除数据库的旧主机名。
- 进入容器执行:
验证主机名解析能力
在运行Docker的Ubuntu Droplet上,或者直接在容器内,执行解析命令测试:nslookup <你的DB_HOST值> # 或者用ping测试(按Ctrl+C终止) ping <你的DB_HOST值>如果返回"Name or service not known",说明主机名完全错误,直接替换为新集群的正确主机名即可。
核对所有数据库连接参数
除了主机名,还要同步检查环境变量中的DB_PORT、DB_USER、DB_PASSWORD、DB_DATABASE是否与新集群的配置一致:- 新集群的端口通常还是5432,但如果有变更需同步
- 注意DigitalOcean托管库默认用户名是
doadmin,而非代码中默认的postgres,恢复备份后需确认实际用户名
修复SSL连接配置(建议补充)
DigitalOcean托管PostgreSQL默认强制要求SSL连接,即使你的代码中DB_SSL=None,后续仍可能出现SSL相关错误。建议修改DSN添加SSL参数:DB_DSN: Final[str] = f"{DB_DRIVER}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_DATABASE}?sslmode=require"或者在
create_async_engine中补充连接参数:db_engine = create_async_engine( Settings.DB_DSN, pool_size=10, max_overflow=10, echo=Settings.DB_ECHO, json_deserializer=orjson.loads, json_serializer=lambda j: orjson.dumps(j).decode("utf-8"), pool_pre_ping=True, pool_recycle=60, future=True, connect_args={"ssl": {"sslmode": "require"}} )
更新环境变量后重启FastAPI容器,测试连接是否恢复。
内容的提问来源于stack exchange,提问作者Uwem Uke
相关产品推荐
相关产品推荐

