【问题标题】:Python: Insert data to database from CSV and then selecting a generated UUID from the tablePython:将数据从 CSV 插入数据库,然后从表中选择生成的 UUID
【发布时间】:2018-11-27 12:47:26
【问题描述】:

我有一张要插入数据库的 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)使用(foo1,foo2)创建一个临时表。 2) 在 t.foo1 = tmp.foo1 和 t.foo2 = tmp.foo2 上加入表 t 得到对应的 uuid。 3) 插入到 another_table (t.uuid, t.foo1, t.foo2)。这假设 foo1 和 foo2 对是唯一的。

标签: python sql postgresql pandas csv


【解决方案1】:

我能够自己解决这个问题,而无需对我的代码进行太多调整。我不得不用我的代码解决另一个问题,其中 csv 文件中的几个值是空值,但是转换为 csv 使它看起来像是空字符串。通过使用 pandas,我能够将所有空值设置为“无”,然后在将每一行插入数据库之前对其进行清理:

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并将其放入另一个表中,只要您在表中具有唯一值即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多