添加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,性能更优:
- 更新
pyproject.toml的依赖配置:
python = "^3.11" aiohttp = "^3.8.5" aiodns = "^3.0.0" pyyaml = "^6.0.1" asyncpg = "^0.29.0"
- 调整
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
相关产品推荐
相关产品推荐

