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

升级SQLAlchemy至2.0.4后出现ProgrammingError:无法适配Row类型

问题

项目依赖版本升级(如Flask、SQLAlchemy等)后,执行代码时触发错误:sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'Row'。

现有代码:

def get_by_ids(model, id_list, field='uuid'):
    field = getattr(model, field)
    items = Database.get_session().query(model).filter(field.in_(id_list))
    return items.all()

当前参数详情:

  • id_list = [('hskzmjosomxj',), ('f7l708nhrbwk',), ('di8cucj8pdbh',), ('p3kqrdnkupby',)](元素为单元素元组的列表)
  • field = Bucket.key(类型为<class 'sqlalchemy.orm.attributes.InstrumentedAttribute'>)
  • model = Bucket

该代码在SQLAlchemy 1.3.24中可正常运行,升级至2.0.4后报错;移除.filter(field.in_(id_list))后,all()函数能正常执行。请问是否需要注册适配器将Row类型转换为Python数据类型?

解决方案

不需要注册适配器,问题出在id_list的格式上:

  • SQLAlchemy 2.0对in_()方法的参数类型校验更严格,不再自动解析单元素元组。你传入的id_list里每个元素都是单元素元组,而Bucket.key是字符串类型字段,类型不匹配导致无法适配。
  • 解决方法是把id_list转换成纯字符串列表,比如修改传入的参数,或者在函数内处理:
    # 在函数内处理id_list,提取元组中的第一个元素
    id_list = [item[0] for item in id_list]
    
  • 修改后的完整函数示例:
    def get_by_ids(model, id_list, field='uuid'):
        # 处理单元素元组列表为纯字符串列表
        id_list = [item[0] for item in id_list]
        field = getattr(model, field)
        items = Database.get_session().query(model).filter(field.in_(id_list))
        return items.all()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:57:17