psycopg2 - Ошибка пропуска данных для поля «id»?

1

Я импортирую CSV файл в postgres и нет уникального столбца в наборе данных. Я хочу добавить поле последовательного идентификатора, чтобы однозначно идентифицировать каждую запись как ее вставленную в таблицу.

Я создал последовательность и добавил поле идентификатора в структуру таблицы, прежде чем запускать импорт:

CREATE SEQUENCE IF NOT EXISTS serial;
CREATE TABLE my_tbl (
    fname    varchar(100),
    lname    varchar(100),
    company  varchar(200),
    id       integer PRIMARY KEY DEFAULT nextval('serial')
);

Я запускаю этот код для импорта CSV, у которого есть данные для fname, lname и компании:

conn = psycopg2.connect(dbname=dbname, host=host, port=port, user=user, password=pwd)
cur = conn.cursor()
cur.copy_expert("copy {} from STDIN CSV HEADER QUOTE '\"'".format(table_name), file)
cur.execute("commit;")

Тем не менее, я получаю сообщение о том, что мне не хватает данных для поля "id". Я предполагаю, что под капотом psycopg2 сопоставляет схемы таблицы CSV и PG для проверки COPY перед попыткой вставки. Правильная вставка будет успешной, так как поле id будет заполнено значением из SEQ.

Как я могу добавить уникальное поле id для каждой записи, скопированной из CSV в таблицу PG?

Теги:
csv
python-3.x
psycopg2

1 ответ

1

У вас есть два варианта. Вы можете указать столбцы целевой таблицы в команде COPY, например:

COPY my_tbl(fname, lname, company) FROM STDIN CSV HEADER QUOTE '"'

Кроме того, создайте таблицу без первичного ключа id, импортируйте данные csv и только затем добавьте первичный ключ:

ALTER TABLE my_tbl ADD id serial PRIMARY KEY;

Не относится. Вам не нужно создавать последовательность для последовательного столбца, пусть Postgres сделает это за вас:

CREATE TABLE my_tbl (
    fname    varchar(100),
    lname    varchar(100),
    company  varchar(200),
    id       serial PRIMARY KEY
);

Затем система знает взаимосвязь между таблицей и последовательностью. (Кроме того, serial не является лучшим именем для последовательности, как вы называете следующий, когда вам это нужно?)

  • 0
    спасибо @klin, возможно ли динамическое заполнение списка столбцов на основе заголовков в файле CSV?
  • 0
    Не автоматически в Postgres, но в Python это должно быть легко, просто прочитайте первую строку файла и соответственно отформатируйте команду.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню