Python:将数据从CSV插入数据库,然后从表中选择一个生成的UUID

时间:2018-11-27 12:47:26

标签: python sql postgresql pandas csv

我有一个要插入数据库的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并将其放入第二张表吗?

1 个答案:

答案 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在表中具有唯一值即可完成此操作。