使用psycopg2的execute_values()批量插入时报字符串格式化错误如何解决
报错原因及解决方案
你出现该报错是对psycopg2.extras.execute_values()的用法存在三处核心错误,对应修复方式如下:
错误点梳理
- 调用
execute_values()时传入的第三个参数不符合要求:该参数需要接收所有待插入行组成的可迭代对象(即你存储了全量数据的data列表本身),你现在通过循环遍历data每次传入单个行d,和方法要求的入参结构不匹配。 - SQL模板写法错误:
execute_values()会自动处理批量值的拼接逻辑,SQL语句只需写为INSERT INTO 表名(字段列表) VALUES %s即可,你写的VALUES (%s),存在多余的括号和逗号,导致语法解析失败。 - 冗余的循环逻辑完全抵消了批量插入的性能优势:逐行调用
execute_values()再加逐行commit,性能甚至不如普通的逐行插入,完全没有用到该方法的批量优化能力。
修正后可运行的代码
import psycopg2.extras # 原有爬取逻辑不变,所有数据统一追加到data列表中 data = [] # 这里是你循环爬取的逻辑,每爬取一条就往data里追加一个元组 results = (court, case_title, issue_date, link, details) data.append(results) # 全量数据爬取完成后,统一执行一次批量插入 sql = '''INSERT INTO dist_crt_opins (court, case_title, issue_date, link, details) VALUES %s''' psycopg2.extras.execute_values(cursor, sql, data, template='(%s, %s, %s, %s, %s)', page_size=1000) conn.commit()
额外优化建议
你之前逐行插入可以成功,说明单条数据的字段数量、类型和表结构是匹配的,按上述修改后即可正常写入。针对10万条量级的数据,你可以把page_size调整到2000-5000,写入效率会更高。
内容的提问来源于stack exchange,提问作者wiedhas
相关产品推荐
相关产品推荐

