如何将大规模Python列表批量存入PostgreSQL表及executemany报错排查
错误原因分析
- PostgreSQL标识符大小写规则问题:PostgreSQL默认会将所有未用双引号包裹的SQL标识符(表名、列名等)自动转换为小写。你的SQL语句中写的表名是
public.stockScrapper_currentday,包含大写字母,PostgreSQL解析时会自动转为全小写的public.stockscrapper_currentday,如果建表时你用双引号保留了大写表名,就会出现找不到对应关系的报错。 - 表名拼写不匹配:你贴出的实际业务表名为
currentDay,但SQL语句中写的表名是stockScrapper_currentday,二者名称完全不一致,这是报错的最核心原因。 - 其他潜在原因:未在public schema下创建对应表、连接的数据库实例错误、当前数据库用户没有该schema/表的访问权限,也可能触发同类报错。
修复方法
- 先对齐表名和列名与实际表结构:你贴出的
currentDay表列名为Stock Code、Stock Price、Low、High、Open、Close,如果要保留列名中的大写和空格,需要用双引号包裹标识符,修改后的插入语句如下:
cursor = connection.cursor() # 注意字段顺序要和你列表的元素顺序一一对应:股票代码、当前价格、成交量、当日最低、当日最高、开盘价,和表列顺序对齐 insert_sql = ''' INSERT INTO public."currentDay" ("Stock Code", "Stock Price", Low, High, Open, Close) VALUES (%s, %s, %s, %s, %s, %s) ''' cursor.executemany(insert_sql, stockDetailsDict) connection.commit()
- 如果你的实际表确实名为
stockScrapper_currentday,只需给大小写混合的表名加上双引号即可:
insert_sql = ''' INSERT INTO public."stockScrapper_currentday" (ticker, stockCurrentPrice, stockVolume, stockDayLow, stockDayHigh, stockOpen) VALUES (%s, %s, %s, %s, %s, %s) '''
- 额外性能优化:如果后续需要导入更大规模的数据,可以改用PostgreSQL原生的
COPY FROM语法,导入速度是executemany的2-10倍。
内容的提问来源于stack exchange,提问作者Ben Daggers
相关产品推荐
相关产品推荐

