Python操作SQLite多IN子句参数绑定错误求助
解决sqlite3.ProgrammingError: 参数绑定数量不匹配的问题
这个错误的根源很明确:你的查询语句里一共生成了4个?占位符(2个对应names里的元素,2个对应ids里的元素),但你传给execute()的参数是(names, ids)——这是一个包含两个列表的元组,相当于只传了2个参数,数据库驱动自然找不到足够的参数来匹配4个占位符,于是抛出了绑定数量不匹配的错误。
要修复这个问题,你需要把names和ids里的所有元素合并成一个扁平的序列(元组或列表),让每个占位符都能对应到一个具体的值。下面是修正后的完整代码:
import sqlite3 conn = sqlite3.connect('test.db') c = conn.cursor() names = ['name1','name2'] ids = ['id1','id2'] # 用多行字符串编写查询语句,可读性更强 query = '''SELECT * FROM STUDENT_DETAILS WHERE NAME IN (%s) AND ID IN (%s)''' % ( ','.join('?'*len(names)), ','.join('?'*len(ids)) ) # 合并参数:将两个列表的元素展开成一个扁平的元组 c.execute(query, (*names, *ids)) # 如果需要获取查询结果,可以添加以下代码 results = c.fetchall() for row in results: print(row) conn.close()
补充几个小细节:
- 如果你使用的是Python 3.5之前的版本,不支持
(*names, *ids)这种解包语法,可以用names + ids来合并两个列表,传给execute()即可。 - 把长查询拆成多行字符串,能避免代码过于拥挤,后期维护也更方便。
- 别忘了如果需要读取查询结果,要调用
fetchall()(获取所有结果)、fetchone()(获取单条结果)或者fetchmany(n)(获取n条结果)方法。
内容的提问来源于stack exchange,提问作者Srinivas Kalleti
相关产品推荐
相关产品推荐

