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
相关产品推荐
相关产品推荐

