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

如何在psycopg2的extras.execute_values()中使用模板参数?

问题

使用psycopg2的extras.execute_values()批量更新数据时未达到预期效果,代码如下:

countyid_landid_tuple_list = [(1,1),(1,2),(2,3)]
sql = "update agri_land set county_id = %s"
extras.execute_values(cur, sql, countyid_landid_tuple_list ,"%s where id = %s")

执行后抛出语法错误:

psycopg2.errors.SyntaxError: error:  语法错误位于","附近或其周围
LINE 1: ...e agri_land set country_id = 1 where id = 1,1 where i...

环境信息:

  • python 3.7.9(64-bit)
  • psycopg2 2.9.5
  • PostgreSQL 12
解决方案

错误根源是execute_values()的模板参数用法错误,该方法会将传入的元组列表拼接为批量语句,但当前写法会导致SQL语法结构混乱。

正确写法需要调整主SQL语句与模板参数的配合:

  1. 主SQL需写成基于VALUES子句的批量更新结构,用%s作为批量数据块的占位符
  2. 模板参数定义单条元组对应的格式化逻辑,与主语句组合成合法的批量更新SQL

正确代码示例:

countyid_landid_tuple_list = [(1,1),(1,2),(2,3)]
sql = """
UPDATE agri_land al
SET county_id = data.county_id
FROM (VALUES %s) AS data(county_id, id)
WHERE al.id = data.id
"""
extras.execute_values(cur, sql, countyid_landid_tuple_list, template="(%s, %s)")

关键说明:

  • execute_values()会按照template格式,将元组列表拼接为VALUES (1,1), (1,2), (2,3)这样的片段,替换主SQL中的%s占位符
  • 通过FROM (VALUES %s)引入批量数据,再通过WHERE al.id = data.id匹配目标行,实现高效批量更新
  • 主语句中的%s是固定的批量数据占位符,template必须与元组的元素数量完全匹配

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:10:05