Я проголосовал за ответ SAVEPOINT - тем более, что он ссылается на вопрос, где мой ответ был принят. ;)
Однако, учитывая ваше заявление в разделе комментариев о том, что вы ожидаете ошибок "чаще, чем нет", могу ли я предложить другую альтернативу?
Это решение фактически возвращает нас к вашему другому вопросу. Разница здесь в том, как очень быстро загрузить данные в нужное место и отформатировать, чтобы перемещать данные по одному SELECT - и - универсален для любой таблицы, которую вы хотите заполнить (поэтому один и тот же код можно использовать для нескольких разных таблиц ). Вот примерная схема того, как бы я делал это в чистом PostgreSQL, предполагая, что у меня есть CSV-файл в том же формате таблицы, в который нужно вставить:
CREATE TEMP TABLE input_file (LIKE target_table);
COPY input_file FROM '/path/to/file.csv' WITH CSV;
INSERT INTO target_table
SELECT * FROM input_file
WHERE (<unique key field list>) NOT IN (
SELECT <unique key field list>
FROM target_table
);
Хорошо, это идеализированный пример, и я также замаскирую несколько вещей (например, отчет о дубликатах, отправка данных в таблицу с помощью данных в памяти Python, копирование из STDIN, а не через файл и т. Д. ), но, надеюсь, основная идея есть, и она позволит избежать значительных накладных расходов, если вы ожидаете, что больше записей будет отклонено, чем принято.