我有一个要插入数据库的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并将其放入第二张表吗?
答案 0 :(得分:0)
我能够自己解决此问题,而无需对我的代码做很多调整。我不得不用我的代码解决另一个问题,其中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在表中具有唯一值即可完成此操作。