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

使用Psycopg2的copy_from导入CSV到Postgres时未自动生成id怎么办?

报错原因

使用psycopg2的copy_from方法导入数据时,你没有指定要导入的字段列表,PostgreSQL默认会按照表的字段定义顺序来匹配CSV文件的列:

  • 你的physical表字段顺序是id → upc → date → quantity → customer
  • 导入时CSV第一列的upc值会被直接插入到id字段,才会触发整数超出范围的报错
  • 完全不需要额外写脚本获取表的最后一个id值,自增主键在你不主动传值的情况下,数据库会自动生成填充。
正确实现方案

你后续调整的代码逻辑是对的,改用copy_expert显式指定和CSV列对应的目标字段列表即可,未声明的id列会由数据库自动生成值,不会和CSV内容冲突。

完整可运行代码如下:

  1. 封装CSV导入函数
def insert_csv(f, table, columns):
    connection = get_postgres_connection()
    cursor = connection.cursor()
    try:
        column_names = ','.join(columns)
        query = f'''
            COPY {table}({column_names})
            FROM STDOUT (FORMAT CSV)
        '''
        cursor.copy_expert(query, f)
        connection.commit()
        return True
    except (psycopg2.Error) as e:
        print(e)
        return False
    finally:
        cursor.close()
        connection.close()
  1. 定义和CSV列顺序对应的目标字段
columns = (
        "upc",
        "date_thru",
        "transaction_type",
        "transaction_type_subtype",
        "country_code",
        "customer",
        "quantity",
        "income_gross",
        "fm_serial",
        "date_usage"
    )
  1. 调用函数导入CSV
with open(dump_file, 'r', newline='', encoding="ISO-8859-1") as f:
        inserted = insert_csv(f, 'physical', columns)

内容的提问来源于stack exchange,提问作者Kevin G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:10