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

添加pg_context到main.py后aiohttp应用启动报错求助

PostgreSQL异步连接报错NotImplementedError分析与解决

问题根源

报错的核心原因是Windows平台下Python 3.8及以上版本默认使用ProactorEventLoop,而你使用的aiopg依赖底层的libpq库是基于同步Socket实现的,ProactorEventLoop不支持add_reader()、remove_reader()这类针对同步Socket的IO监听方法,导致创建数据库连接池时触发异常。

解决方案

提供两种可行方案,按需选择:

方案1:强制切换到SelectorEventLoop

在应用启动代码前显式指定使用兼容同步Socket的SelectorEventLoop,快速解决兼容性问题:
修改main.py,在调用web.run_app()前添加以下代码:

import asyncio

asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

方案2:替换为原生异步驱动asyncpg

如果是长期维护的项目,推荐替换aiopg为asyncpg——这是专为PostgreSQL设计的原生异步驱动,完全适配Windows的ProactorEventLoop,性能更优:

  1. 更新pyproject.toml的依赖配置:
python = "^3.11"
aiohttp = "^3.8.5"
aiodns = "^3.0.0"
pyyaml = "^6.0.1"
asyncpg = "^0.29.0"
  1. 调整db.py的连接逻辑适配asyncpgAPI:
async def pg_context(app):
    conf = app['config']['postgres']
    pool = await asyncpg.create_pool(
        database=conf['database'],
        user=conf['user'],
        password=conf['password'],
        host=conf['host'],
        port=conf['port'],
        min_size=conf['minsize'],
        max_size=conf['maxsize'],
    )
    app['db'] = pool

    yield

    await app['db'].close()

方案对比

  • 方案1属于临时修复,无需替换依赖,适合快速验证功能;
  • 方案2是长期解决方案,彻底规避平台兼容性问题,推荐生产环境采用。

内容的提问来源于stack exchange,提问作者WideWood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:57:01