簡體   English   中英

Python:將數據從CSV插入數據庫,然后從表中選擇一個生成的UUID

[英]Python: Insert data to database from CSV and then selecting a generated UUID from the table

我有一個要插入數據庫的Excel工作表。 我編寫了一個Python腳本,該腳本接受一個Excel文件,將其轉換為CSV,然后將其插入數據庫。

問題在於數據庫包含兩個表,其中一個表具有唯一的ID,該ID會自動生成並在將數據插入到表中時設置。 另一個表將此用作外鍵。

這是創建表的方式:

create table table (
  id             uuid DEFAULT uuid_generate_v4() PRIMARY KEY NOT NULL,
  foo1           varchar(255),
  foo2           varchar(255),
  foo3           varchar(255),
  foo4           varchar(255)
);

create table another_table (
  id             uuid PRIMARY KEY references table (id)
  foo1           varchar(255),
  foo2           varchar(255)
);

這是我用來將數據插入數據庫的代碼:

with open(csv_file, 'rb') as f:
        reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
        next(reader)
        for row in reader:
            cur.execute(
                "INSERT INTO table (foo1, foo2, foo3, foo4) VALUES (%s, %s, %s, %s); ",
                "INSERT INTO another_table (foo1, foo2) VALUES (%s, %s),
                row
            )

conn.commit()

這會將數據插入數據庫,但是another_table中的ID字段將為空。 有誰知道我如何獲取此ID並將其放入第二張表?

我自己可以解決此問題,而無需對我的代碼做很多調整。 我不得不用我的代碼解決另一個問題,其中csv文件中的多個值都為空值,但是轉換為csv使其看起來像是空字符串。 通過使用熊貓,我能夠將所有空值設置為“ None”,然后在將每一行插入數據庫之前對其進行清理:

with open(csv_file, 'rb') as f:
        reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
        next(reader)
        for row in reader:
            clean_row = []
        for x in row:
            if x == "None":
                clean_row.append(None)
            else:
                clean_row.append(x)
                cur.execute(
                    "INSERT INTO table (foo1, foo2, foo3, foo4) VALUES (%s, %s, %s, %s); ",
                    "INSERT INTO another_table (foo1, foo2) VALUES (%s, %s),
                    clean_row
                )

conn.commit()

現在,來自csv的值被放入一個數組中,我可以在查詢中使用該數組向表詢問其ID,如下所示:

with open(csv_file, 'rb') as f:
            reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
            next(reader)
            for row in reader:
                clean_row = []
            for x in row:
                if x == "None":
                    clean_row.append(None)
                else:
                    clean_row.append(x)
                    cur.execute(
                        "INSERT INTO table (foo1, foo2, foo3, foo4) VALUES (%s, %s, %s, %s); ",
                        "INSERT INTO another_table (foo1, foo2, id) VALUES (%s, %s, SELECT id FROM table WHERE "
        "foo1 = '" + clean_row[0] + "' AND foo2 = '" + clean_row[1] + "')),
                        clean_row
                    )

    conn.commit()

這將獲取ID並將其放入another_table,只要u在表中具有唯一值,就可以完成此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM