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