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

Python读取CSV生成字典后插入PostgreSQL报错如何解决

问题解决步骤

1 修正CSV读取配置

你当前csv.DictReader的quotechar参数设置错误,你的CSV文件中字段的包裹符是双引号,不是空格,因此需要将quotechar=' '修改为quotechar='"'。修改后读取的字段名和值就不会携带多余的双引号,比如字段名会变成正常的PATIENT ID、EVENT TIME,值也会变成干净的1、2021-07-07T02:27:00Z等。

2 修正SQL插入写法,使用参数化查询

不要使用f字符串拼接SQL语句,这会导致两个核心问题:

  • 字符串类型的插入值没有自动加单引号,数据库会把传入的值识别为列名,直接触发你遇到的UndefinedColumn错误
  • 存在SQL注入风险,安全性极低

psycopg2原生支持参数化查询,使用%s作为占位符,把插入参数以元组的形式传给cur.execute的第二个参数即可,psycopg2会自动处理类型转换、引号添加、特殊字符转义等逻辑。

3 补充事务提交逻辑

psycopg2默认开启事务,执行插入操作后必须调用conn.commit()提交事务,否则数据不会真正写入数据库。


完整修正后代码

import psycopg2
import csv

# 建立数据库连接
conn = psycopg2.connect(host='localhost', dbname='patientdb',user='username',password='password',port='')
cur = conn.cursor()

with open(r'apps/patients/management/commands/events.csv') as csvfile:
    # 修正quotechar参数为双引号
    spamreader = csv.DictReader(csvfile, delimiter=',', quotechar='"')
    for row in spamreader:
        # 使用参数化查询,%s做占位符,参数放元组中传入
        cur.execute("""
            INSERT INTO patients_event (patient_id, event_type_id, event_value, event_unit, event_time) 
            VALUES (%s, %s, %s, %s, %s)
        """, (
            row['PATIENT ID'],
            row['EVENT TYPE'],
            row['EVENT VALUE'],
            row['EVENT UNIT'],
            row['EVENT TIME']
        ))

# 提交事务
conn.commit()
# 关闭游标和连接
cur.close()
conn.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:00