使用psycopg3将CSV数据导入PostgreSQL失败求助
解决psycopg3导入CSV到PostgreSQL的问题
先处理事务失败报错
你遇到的InFailedSqlTransaction错误,是因为之前存在未回滚的失败事务,导致后续SQL命令被阻塞。先执行回滚操作清除异常状态:
conn.rollback()
正确的psycopg3 CSV导入代码
对比你之前的psycopg2代码,psycopg3的copy接口有几个关键差异需要注意,以下是修正后的完整代码:
tabname = 'rd2' fname = 'new_data.csv' # 清除之前的失败事务状态 conn.rollback() with open(fname, 'r') as f: # 跳过CSV表头行 next(f) # 在COPY命令中指定CSV格式和分隔符,匹配你的文件 with cur.copy(f"COPY {tabname} FROM STDIN WITH (FORMAT CSV, DELIMITER ',')") as copy: # 遍历所有数据行,逐行写入 for line in f: # 将每行字符串分割为字段列表 fields = line.strip().split(',') copy.write_row(fields) # 事务提交要放在copy上下文管理器之外 conn.commit()
更健壮的字段处理方案(适配含逗号的字段)
如果你的CSV存在带引号的字段(比如"test,data"),直接用split(',')会分割错误,建议用Python内置的csv模块解析:
import csv tabname = 'rd2' fname = 'new_data.csv' conn.rollback() with open(fname, 'r', newline='') as f: reader = csv.reader(f) next(reader) # 跳过表头 with cur.copy(f"COPY {tabname} FROM STDIN WITH (FORMAT CSV)") as copy: for row in reader: copy.write_row(row) conn.commit()
关键差异说明
- psycopg2的
copy_from可直接接管文件对象,psycopg3需要通过copy上下文管理器手动处理每行数据 - psycopg3的COPY命令需要显式声明格式参数,避免和文件格式不匹配
- 事务异常后必须先执行回滚,才能继续执行新的数据库操作
内容的提问来源于stack exchange,提问作者matt cooper
相关产品推荐
相关产品推荐

