我有一個 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"']})""")
有朋友可以幫忙嗎?
uj5u.com熱心網友回復:
用這個:
cur.execute("""INSERT INTO patients_event (patient_id, event_type_id , event_value ,event_unit, event_time) VALUES ({1},{2},{3},{4},{5})"""
.format(row['"PATIENT ID'][1:], row['EVENT TYPE'], row['EVENT VALUE'], row['EVENT UNIT'], row['EVENT TIME"'][:-1]))
因此,這基本上處理了我在此處的評論中提到的導致此問題的輸出字典中的額外引號。
而且,這就是為什么
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');
在 db 終端上傳遞,因為您可以看到以兩種方式插入此處的值之間的差異。
更新:避免使用 python 的字串格式進行查詢,因為它可能導致錯誤的查詢或 sql 注入的漏洞點。請參閱引數以了解執行此操作的正確方法,正如 Adrian 在下面的評論中提到的那樣。
uj5u.com熱心網友回復:
所以 CSV 的一個問題是"在每一行的開頭和結尾。您解釋它的方式導致它成為 SQL 運算式的一部分。
here
LINE 2: ("1,HR,82
這會導致錯誤,因為它沒有正確關閉",實際上它不打算出現在生成的 SQL 中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/356345.html
標籤:Python sql 数据库 PostgreSQL
下一篇:MySQL8:授予列級權限?
