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

使用Psycopg2 execute_values时字符串拼接报错,求修复方案

解决Psycopg2 execute_values() 批量插入时的占位符冲突问题

你的代码报错核心原因是execute_values()要求INSERT语句的VALUES部分仅需一个占位符(%s),而你手动生成了与列数一致的多个占位符,导致方法无法正确解析查询结构。

修正后的代码实现

import psycopg2
from psycopg2 import sql
from psycopg2.extras import execute_values

table='my_tab'
schema='my_schema'
col_lst = ['emp_id', 'emp_name', 'emp_age', 'emp_salary']
rec_lst = [('1234', 'John', 35, 10000), ('5678', 'Mike', 42, 15000), ('3452', 'Jason', 33, 15000)]

# 构建基础查询,VALUES部分仅保留一个%s作为单条记录的占位符
query = sql.SQL("INSERT INTO {schema}.{table} ({cols}) VALUES %s;")
col_str = sql.SQL(', ').join(sql.Identifier(col) for col in col_lst)

# 安全替换schema、table、列名占位符
query = query.format(
    schema=sql.Identifier(schema),
    table=sql.Identifier(table),
    cols=col_str
)

# 执行批量插入
execute_values(cursor, query, rec_lst, page_size=1000)

关键说明

  • execute_values()的设计逻辑是:自动将传入的rec_lst中的每条记录转换为(val1, val2, ...)格式,然后批量拼接成VALUES (record1), (record2), ...的结构,因此仅需一个%s占位符代表单条记录。
  • 使用sql.Identifier和sql.SQL处理标识符(schema、表名、列名),可以避免SQL注入风险,这也是Psycopg2推荐的安全写法。
  • 原代码中sql.Placeholder() * len(col_lst)生成了多个占位符,与execute_values的要求冲突,这是报错的直接原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:36:22