repl.it环境下discord.py连接PostgreSQL报[Errno 111/99]连接错误问询
根因判定
你遇到的问题既不是本地PostgreSQL服务故障,也不是本地程序的基础配置错误,核心矛盾是运行环境的网络边界错位:
当前你的Discord机器人代码是跑在Repl.it的云端沙箱虚拟机上,而非你自己的本地电脑。代码里asyncpg默认取host=localhost(即127.0.0.1)时,指向的是Repl.it这台云端虚拟机的回环网卡,和你本地搭建的PostgreSQL服务完全不在同一个网络平面,根本无法连通。
对应错误堆栈的两个报错细节,刚好能匹配这个场景:
[Errno 111] Connect call failed ('127.0.0.1', 5432):Repl.it的云端虚拟机内部,5432端口没有运行任何PostgreSQL服务,连接请求直接被操作系统拒绝[Errno 99] Cannot assign requested address:Repl.it沙箱的临时出站端口资源限制,属于次要衍生报错,不影响核心故障判断
可落地的解决步骤
- 方案1:打通Repl.it到本地PostgreSQL的公网通路
- 修改本地PostgreSQL的核心配置:将
postgresql.conf中的listen_addresses从默认的localhost调整为*,允许非本地回环的外部连接;同步修改pg_hba.conf,新增对应账号的远程访问权限规则 - 配置本地网络的端口转发与防火墙规则:把本地网络的公网5432端口映射到运行PostgreSQL服务的本地机器上,关闭防火墙对该端口的拦截
- 修改asyncpg连接代码,不再使用默认的localhost地址,显式指定本地网络的公网IP/动态域名,同时强制开启SSL避免明文传输账号密码:
async def create_db_pool(): client.pg_con = await asyncpg.create_pool( host="你的本地公网IP/动态域名", port=5432, database="mainbank", user="postgres", password=password, ssl="require" )
- 修改本地PostgreSQL的核心配置:将
- 方案2(推荐,安全成本更低):将mainbank数据库迁移到支持公网访问的托管PostgreSQL服务上,Repl.it上的机器人代码直接连接托管服务的地址,不需要折腾本地端口映射、公网暴露等有安全风险的配置
新手踩坑提醒:Repl.it的运行环境是隔离的云端沙箱,不存在“代码在本地跑通后上传到Repl.it,就能直接访问本地数据库”的逻辑,所有代码内的localhost指向的都是沙箱自身,和你的本地设备无任何网络关联。
内容的提问来源于stack exchange,提问作者EpicGoodBoi
相关产品推荐
相关产品推荐

