[英]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.