如何使用Python实现PostgreSQL多条件批量删除操作
问题原因
psycopg2.extras.execute_values默认仅支持查询语句中存在1个%s占位符,用于批量填充值列表,你的写法里写了2个占位符不符合函数要求- 你手动给
company_id对应的占位符加了单引号'%s'是错误的,psycopg2会自动处理参数转义,手动加引号会导致语法错误 - 原代码还存在变量名不匹配问题:定义的查询变量是
query,调用execute_values时传的是delete_query,会触发变量未定义报错
正确实现方式
方法1:IN子句匹配多列元组(适合小批量删除)
from psycopg2.extras import execute_values # 整个值列表仅用1个%s占位符,无需手动加引号 delete_query = "DELETE FROM products WHERE (company_id, product_id) IN %s" # 待删除条件列表,每个元素对应(company_id, product_id) values = [(1,2), (3,4)] # 通过template参数指定每组值的格式,匹配两个列的顺序 execute_values(self.cursor, delete_query, values, template="(%s, %s)")
方法2:USING子句关联值列表(适合大批量删除,性能更优)
from psycopg2.extras import execute_values delete_query = """ DELETE FROM products p USING (VALUES %s) AS v(company_id, product_id) WHERE p.company_id = v.company_id AND p.product_id = v.product_id """ values = [(1,2), (3,4)] execute_values(self.cursor, delete_query, values, template="(%s, %s)")
注意事项
执行删除操作前建议先执行对应的SELECT语句验证待删除记录是否正确,避免误删:
SELECT * FROM products WHERE (company_id, product_id) IN ((1,2), (3,4))
内容的提问来源于stack exchange,提问作者Raju
相关产品推荐
相关产品推荐

