如何在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语句与模板参数的配合:
- 主SQL需写成基于
VALUES子句的批量更新结构,用%s作为批量数据块的占位符 - 模板参数定义单条元组对应的格式化逻辑,与主语句组合成合法的批量更新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
相关产品推荐
相关产品推荐

