如何在PostgreSQL查询中使用多个pandas列表过滤数据?
报错原因
cursor.execute()方法仅接收2个入参:第一个是预处理的SQL语句,第二个是所有查询参数组成的一维序列/字典,你拆分传入两个列表相当于给方法传了3个参数,不符合入参要求。
修复方案
方案1:基于原有写法最小修改
你已经按顺序生成了先subj_list、后class_list的占位符,只需要把两个列表按顺序拼接成一个一维序列作为参数传入即可:
subj_list = [1,2,3,4] class_list = [4,5,6,7,8,9,10,11,12,13] sql = "select * from tablea where subject_id in ({}) and class_id in ({})" sub_ids = ', '.join(['%s'] * len(subj_list)) class_ids = ', '.join(['%s'] * len(class_list)) sql = sql.format(sub_ids, class_ids) # 按占位符顺序拼接两个列表作为统一参数 cur.execute(sql, subj_list + class_list)
方案2:更简洁的ANY操作符实现(推荐)
不需要动态拼接占位符,直接使用PostgreSQL原生的ANY匹配数组参数,代码更易维护:
subj_list = [1,2,3,4] class_list = [4,5,6,7,8,9,10,11,12,13] # 直接用%s作为数组参数占位符 sql = "select * from tablea where subject_id = ANY(%s) and class_id = ANY(%s)" # 传入两个列表组成的元组即可 cur.execute(sql, (subj_list, class_list))
这个方案不需要根据列表长度动态修改SQL结构,避免了拼接占位符可能出现的顺序错误问题,适配任意长度的输入列表。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

