使用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
相关产品推荐
相关产品推荐

