代码之家  ›  专栏  ›  技术社区  ›  William

如何在sql中插入包含2个外键的行?

  •  0
  • William  · 技术社区  · 3 年前

    我有三张桌子:

    event,event_type,patient
    

    event_type和patient都是事件表的外键。

    event fields:id, event_type(foreign key),event_unit, event_value,event_time, patient(foreign key)
    
    event_type fields: id, name
    
    patient fields : patient_id ,patient_name
    

    我有一个csv文件events.csv:

    import csv
    with open(r'/Users/williaml/Downloads/events.csv') as csvfile: 
        spamreader = csv.reader(csvfile, delimiter=',' ,quotechar=' ')
        for row in spamreader:
            print(row)
    

    输出为:

    ['"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"']
    ['"2', 'John', 'HR', '83', 'beats/minute', '2021-07-07T02:27:00Z"']
    ['"2', 'John', 'RR', '14', 'breaths/minute', '2021-07-07T02:27:00Z"']
    ['"1', 'Jane', 'HR', '88', 'beats/minute', '2021-07-07T02:28:00Z"']
    ['"1', 'Jane', 'RR', '20', 'breaths/minute', '2021-07-07T02:28:00Z"']
    ['"2', 'John', 'HR', '115', 'beats/minute', '2021-07-07T02:28:00Z"']
    ['"2', 'John', 'RR', '5', 'breaths/minute', '2021-07-07T02:28:00Z"']
    

    现在我想将这些行插入数据库:

    import psycopg2
    conn = psycopg2.connect(host='localhost', dbname='patientdb',user='username',password='password',port='')
    cur = conn.cursor()
    
        import csv
    with open(r'/Users/williaml/Downloads/events.csv') as csvfile: 
        spamreader = csv.reader(csvfile, delimiter=',' ,quotechar=' ')
        for row in spamreader:
                INSERT INTO event (patient_id, patient_name, event_type, event_value ,event_unit, event_time) VALUES ( row[0],row[1],row[3],row[4],row[5])
    

    收到错误:

    psycopg2.errors.UndefinedColumn: column "patient_name" of relation "event" does not exist
    

    我想原因是我不能直接插入整行,因为值属于不同的表。

    有朋友可以帮忙吗?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Adrian Klaver    3 年前

    假设 event_type patient 已经有了正确的信息,那么你可以 INSERT 没有 patient_name (如所述 patient_id )并输入 patient_id 值转换为 病人 字段在 event 。如果你使用 csv.DictReader 从…起 csv 那么你可以做一些事情,比如:

    INSERT INTO 
        event (patient, event_type, event_value ,event_unit, event_time) VALUES 
      (row['PATIENT ID'],row['EVENT TYPE'],row['EVENT VALUE'],
       row['EVENT UNIT'],row['EVENT TIME'])