You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:06:03