Python: вставить данные в базу данных из CSV и затем выбрать сгенерированный UUID из таблицы - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть лист Excel, который нужно вставить в базу данных.Я написал скрипт Python, который берет файл Excel, преобразует его в CSV и затем вставляет его в базу данных.

Проблема состоит в том, что база данных содержит две таблицы, где одна из них имеет уникальный идентификаторкоторый генерируется автоматически и устанавливается при вставке данных в таблицу.Другая таблица использует это как внешний ключ.

Вот как создаются мои таблицы:

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 будет пустым. Кто-нибудь знает, как я могу получить этот идентификатор и поместить его во вторую таблицу?

1 Ответ

0 голосов
/ 28 ноября 2018

Я смог решить это сам, не внося особых изменений в мой код.Мне пришлось решить еще одну проблему с моим кодом, где несколько значений в файле CSV, где нулевые значения, но преобразование в 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 теперь помещаются в массив, который яможно использовать в моем запросе для запроса таблицы для его идентификатора, например:

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()

Это позволит получить идентификатор и поместить его в another_table, и это можно сделать, если у вас есть уникальные значения в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...