升级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
相关产品推荐
相关产品推荐

