使用psycopg2的copy_expert导入CSV到Postgres无报错无数据问题求助
PostgreSQL CSV导入无报错但数据未入库排查方案
前置背景:postgresql.conf配置文件中
log_statement参数默认配置为#log_statement = 'none' # none, ddl, mod, all,用户需要导入30万条记录的CSV文件到PostgreSQL数据库,执行Python脚本无报错但数据未写入。
用户执行的脚本如下:
import psycopg2 # 数据库连接 try: conn = psycopg2.connect(database="<db>", user="<user>", password="<pwd>", host="<host>", port="<port>") print("Database Connected....") except: print("Unable to Connect....") cur = conn.cursor() # 执行COPY导入 try: sqlstr = "COPY \"HISTORICALS\".\"HISTORICAL_DAILY_MASTER\" FROM STDIN DELIMITER ',' CSV" with open('/Users/kevin/Dropbox/Stonks/HISTORICALS/dump.csv') as f: cur.copy_expert(sqlstr, f) conn.commit() print("COPY pass") except: print("Unable to COPY...") # 关闭连接 cur.close() conn.close()
可能的原因及排查步骤
- 异常捕获吞掉错误信息:脚本中的异常捕获未打印具体错误,所有COPY阶段的报错(如数据类型不匹配、字段约束冲突、表不存在、权限不足等)都会直接输出
Unable to COPY...但看不到根因。请将裸except修改为except Exception as e,在异常分支添加print(e)打印具体错误,可快速定位问题。 - CSV读取编码不匹配:打开CSV文件时未指定编码,使用系统默认编码读取非匹配编码的文件(如UTF-8带BOM、GBK编码的CSV)会导致读取内容异常,甚至被识别为空内容。可修改open语句为
open('/Users/kevin/Dropbox/Stonks/HISTORICALS/dump.csv', encoding='utf-8')测试,也可在读取后打印第一行内容确认文件读取正常。 - 未指定CSV表头参数:如果CSV文件第一行是字段名,COPY语句未加
HEADER参数会将表头当做第一行数据插入,若表头和字段类型不匹配会触发报错被捕获。可将COPY语句修改为COPY "HISTORICALS"."HISTORICAL_DAILY_MASTER" FROM STDIN DELIMITER ',' CSV HEADER。 - 标识符大小写不匹配:PostgreSQL会自动将未加双引号的标识符转为小写,脚本中加双引号指定了大写的模式名和表名,需要确认数据库中实际的模式名、表名确实是全大写,否则会操作不存在的对象触发报错。
- COPY未读取到有效数据:可在
conn.commit()前添加print(cur.rowcount)打印COPY操作影响的行数,如果行数为0说明COPY阶段未读取到有效数据,优先排查文件是否为空、文件权限是否正常、路径是否正确。
内容的提问来源于stack exchange,提问作者kevin.c
相关产品推荐
相关产品推荐

