You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:20:25