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

Python用INSERT INTO导入CSV到PostgreSQL表时出现列不存在错误

问题:PostgreSQL插入CSV数据报错“列不存在”,实际是ID值被识别为列名

问题详情

使用Python循环执行INSERT INTO语句,将含4列的CSV数据导入PostgreSQL表时,报错提示某列不存在,但该“列”实际是ID列的首个值A。

表结构

IDGenderWeightAge
AF12120
BM15631
CF11018

原运行代码

import pandas as pd

df = pd.read_csv('df.csv')

for x in df.index:
    cursor.execute("""
    INSERT INTO iddata (ID, Gender, Weight, Age)
    VALUES (%s, %s, %d, %d)""" % (df.loc[x]['ID'],
                                  df.loc[x]['Gender'],
                                  df.loc[x]['Weight'],
                                  df.loc[x]['Age']))
    conn.commit

错误信息

UndefinedColumn: column "a" does not exist
LINE 3:     VALUES (A, F, 121, 20)
                    ^

解决方案

错误原因

用字符串格式化%拼接SQL语句时,字符串类型的ID(如A)和Gender(如F)没有被添加引号,PostgreSQL将它们识别为列名,导致报错。同时conn.commit未加括号,没有实际执行提交操作。

修正后的代码

使用参数化查询(推荐方式,避免SQL注入和语法错误),并修正提交方法的调用:

import pandas as pd

df = pd.read_csv('df.csv')

for x in df.index:
    cursor.execute("""
    INSERT INTO iddata (ID, Gender, Weight, Age)
    VALUES (%s, %s, %s, %s)""", 
    (df.loc[x]['ID'], df.loc[x]['Gender'], df.loc[x]['Weight'], df.loc[x]['Age']))
    conn.commit()  # 注意添加括号调用方法

注:参数化查询中统一用%s作为占位符,PostgreSQL的psycopg2驱动会自动根据数据类型处理格式,不需要区分%s和%d。

更高效的批量插入方案

如果数据量较大,循环插入效率极低,推荐使用pandas的to_sql方法批量导入:

import pandas as pd
from sqlalchemy import create_engine

# 创建数据库连接,替换为你的数据库信息
engine = create_engine('postgresql://username:password@host:port/dbname')

df = pd.read_csv('df.csv')
# 批量插入数据
df.to_sql('iddata', engine, if_exists='append', index=False)

if_exists='append'表示如果表存在则追加数据,可根据需求改为replace(替换表)或fail(表存在则报错)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:36:29