基于aiohttp+asyncpgsa开发RESTAPI时调用fetch触发record_class类TypeError
报错核心原因
该问题属于典型的依赖版本接口不兼容:
- 新版
asyncpg迭代时,为fetch、fetchrow等查询方法新增了record_class入参,调用内部_execute方法时会自动把该参数透传 - 所使用的旧版本
asyncpgsa重写了继承自 asyncpg 连接类的_execute方法,方法签名没有预留对应参数的接收位置,无法处理透传过来的record_class关键字参数,最终触发TypeError报错。
排查步骤
- 执行
pip list | grep -E 'asyncpg|asyncpgsa'查看当前环境两个库的实际版本,与运行正常的同栈项目做版本对标 - 检查最近的依赖安装记录,确认是否存在未锁定版本时自动拉取了高版本 asyncpg 的情况
可实现的解决方案
- 版本降级适配:将 asyncpg 降至与当前 asyncpgsa 兼容的版本(即 0.29.0 之前的版本,该版本是首次新增
record_class参数的迭代版本),可执行pip install asyncpg==0.28.0后重试原有查询逻辑 - 版本升级适配:直接将 asyncpgsa 升级到适配新版 asyncpg 接口的版本,升级前核对官方适配说明,避免引入其他 breaking change
- 临时代码补丁:如果暂不调整依赖版本,可手动修改 asyncpgsa 封装的
_execute方法,增加透传参数的接收逻辑,修改后参考代码:
def _execute(self, query, args, limit, timeout, return_status=False, **kwargs): query, compiled_args = compile_query(query, dialect=self._dialect) args = compiled_args or args return super()._execute( query, args, limit, timeout, return_status=return_status, **kwargs )
内容的提问来源于stack exchange,提问作者Alex Semenchenko
相关产品推荐
相关产品推荐

