Python psycopg2在WHERE子句使用tuple元组作为IN参数报错如何解决
错误原因
- 你使用的
{}是Python原生字符串格式化的占位符,并非Psycopg2参数绑定的规范占位符,Psycopg2统一使用%s作为参数占位符,和参数类型无关。 - 你直接把元组
vilist传给execute方法的第二个参数时,Psycopg2会把元组内的4个元素识别为4个独立的查询参数,和SQL语句中仅需要1个IN条件参数的逻辑不匹配。
正确写法
直接使用%s作为IN子句的占位符,把整个元组作为单个参数传入即可,Psycopg2会自动将元组适配为IN条件需要的格式:
vilist = (1,2,3,4) # 占位符用%s即可,不需要额外加括号 sql = "select * from temp.table1 where ids in %s" # 注意第二个参数要把vilist包在一个长度为1的元组里,末尾的逗号不能省略,避免被识别为运算优先级括号 cur.execute(sql, (vilist,))
执行后会自动生成你期望的SELECT * FROM temp.table1 WHERE ids IN (1,2,3,4)语句,同时可以避免SQL注入风险,不要自行使用format拼接SQL字符串。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

