psycopg2.copy_expert - вставлять только новые данные - PullRequest
0 голосов
/ 20 марта 2020

Я использую psycopg2.copy_expert для копирования данных из CSV в PostgreSQL БД. Я запускаю это каждый день и хочу, чтобы вставлялись только новые данные. Если данные уже присутствуют, никакие действия не должны выполняться. Есть ли способ использовать функцию copy_expert, чтобы сделать это «из коробки», или мне самому нужно написать код его логики c и создать новый CSV-файл, содержащий только дельта-изменения?

copy_sql = """
           COPY %s FROM stdin WITH CSV HEADER
           DELIMITER as ','
           """
f = open(f"{file_path}", 'r', encoding="utf-8")
cur.copy_expert(sql=copy_sql % table_name, file=f)

1 Ответ

1 голос
/ 31 марта 2020

Вы можете использовать temporary table в сочетании с ON CONFLICT для достижения этой цели:

CREATE TEMPORARY TABLE buffer (
    field1,
    field2,
    ...
    fieldn
);

COPY buffer FROM STDIN With CSV HEADER DELIMITER as ',';

INSERT INTO table(field1, field2, ... fieldn)
SELECT field1, field2, ... fieldn FROM buffer
ON CONFLICT (ID) DO NOTHING;

DROP TABLE buffer;

Вы можете использовать query выше вместе с дескриптором файла для copy_expert.

...