我有一张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()
这将向数据库中插入数据,但另一个表中的ID字段将为空有人知道我如何获取这个ID并将其放入第二个表中吗
我能够自己解决这个问题,而无需对代码进行太多调整。我不得不解决我的代码中的另一个问题,csv文件中的几个值为null,但转换为csv使它看起来像是空字符串。通过使用pandas,我可以将所有空值设置为"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并将其放入另一个表中,只要u在表中具有唯一值,就可以完成。