使用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内容冲突。
完整可运行代码如下:
- 封装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()
- 定义和CSV列顺序对应的目标字段
columns = ( "upc", "date_thru", "transaction_type", "transaction_type_subtype", "country_code", "customer", "quantity", "income_gross", "fm_serial", "date_usage" )
- 调用函数导入CSV
with open(dump_file, 'r', newline='', encoding="ISO-8859-1") as f: inserted = insert_csv(f, 'physical', columns)
内容的提问来源于stack exchange,提问作者Kevin G
相关产品推荐
相关产品推荐

