【发布时间】:2021-12-24 04:23:41
【问题描述】:
我有一个 csv events.csv:
"PATIENT ID,PATIENT NAME,EVENT TYPE,EVENT VALUE,EVENT UNIT,EVENT TIME"
"1,Jane,HR,82,beats/minute,2021-07-07T02:27:00Z"
"1,Jane,RR,5,breaths/minute,2021-07-07T02:27:00Z"
然后我用python csv读取它:
import csv
with open(r'/Users/williaml/Downloads/events.csv') as csvfile:
spamreader = csv.DictReader(csvfile, delimiter=',' ,quotechar=' ')
for row in spamreader:
print(row)
输出:
{'"PATIENT ID': '"1', 'PATIENT NAME': 'Jane', 'EVENT TYPE': 'HR', 'EVENT VALUE': '82', 'EVENT UNIT': 'beats/minute', 'EVENT TIME"': '2021-07-07T02:27:00Z"'}
{'"PATIENT ID': '"1', 'PATIENT NAME': 'Jane', 'EVENT TYPE': 'RR', 'EVENT VALUE': '5', 'EVENT UNIT': 'breaths/minute', 'EVENT TIME"': '2021-07-07T02:27:00Z"'}
我尝试将这些行插入数据库:
import psycopg2
conn = psycopg2.connect(host='localhost', dbname='patientdb',user='username',password='password',port='')
cur = conn.cursor()
import csv
with open(r'apps/patients/management/commands/events.csv') as csvfile:
spamreader = csv.DictReader(csvfile, delimiter=',' ,quotechar=' ')
for row in spamreader:
cur.execute(f"""INSERT INTO patients_event (patient_id, event_type_id , event_value ,event_unit, event_time) VALUES
({row['"PATIENT ID']},{row['EVENT TYPE']},{row['EVENT VALUE']},
{row['EVENT UNIT']},{row['EVENT TIME"']})""")
错误:
psycopg2.errors.UndefinedColumn: column "1,HR,82,
beats/minute,2021-07-07T02:27:00Z" does not exist
LINE 2: ("1,HR,82,
^
但是,如果我直接在数据库命令终端中运行以下 sql,它就可以工作:
INSERT INTO patients_event (patient_id, event_type_id , event_value ,event_unit, event_time) VALUES('1','HR','82','beats/minute','2021-07-07T02:27:00Z');
所以我认为这部分代码似乎不正确:
cur.execute(f"""INSERT INTO patients_event (patient_id, event_type_id , event_value ,event_unit, event_time) VALUES
({row['"PATIENT ID']},{row['EVENT TYPE']},{row['EVENT VALUE']},
{row['EVENT UNIT']},{row['EVENT TIME"']})""")
有朋友可以帮忙吗?
【问题讨论】:
-
您能在
{'"PATIENT ID': '"1',中看到任何内容吗?这可能是造成这种情况的原因。这是来自您正在写入数据库的上述输出。 -
为什么不使用COPY?
-
@balderman 并非每一列都需要。例如,不需要患者姓名,我还能使用复制吗?
-
@William 我认为 COPY 知道如何处理这种情况。
-
CSV 文件是否真的在每一行的开头和结尾都有双引号,而其他地方没有?这将使每一行成为一个字段,这似乎非常可疑。如果可能的话,这应该在上游修复。一旦你解决了这个问题,请使用proper parameter passing 而不是字符串格式将值传递给 SQL 查询。
标签: python sql database postgresql