Python用INSERT INTO导入CSV到PostgreSQL表时出现列不存在错误
问题:PostgreSQL插入CSV数据报错“列不存在”,实际是ID值被识别为列名
问题详情
使用Python循环执行INSERT INTO语句,将含4列的CSV数据导入PostgreSQL表时,报错提示某列不存在,但该“列”实际是ID列的首个值A。
表结构
| ID | Gender | Weight | Age |
|---|---|---|---|
| A | F | 121 | 20 |
| B | M | 156 | 31 |
| C | F | 110 | 18 |
原运行代码
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
相关产品推荐
相关产品推荐

