Как узнать, изменилась ли запись в Postgres

У меня есть немного "upsert» тип вопроса ... но я хочу выбросить это, потому что этонемного отличается от того, что ячитаем на стеке

Основная проблема. Я '

Я работаю над переходом с MySQL на PostgreSQL 9.1.5 (размещен на Heroku). Как часть этого, мне нужно импортировать несколько файлов CSV каждый день. Некоторые данные являются информацией о продажах и почти гарантированно являются новыми и должны быть вставлены. Но другие части данных почти гарантированно будут такими же. Например, файлы CSV (примечание во множественном числе) будут содержать информацию о точках продаж (POS). Это редко меняется (и, скорее всего, только через дополнения). Тогда есть информация о продукте. Есть около 10000 продуктов (подавляющее большинство не изменится, но этовозможно иметь как дополнения, так и обновления).

Последний пункт (но важный) заключается в том, что у меня есть требование предоставить контрольный журнал / информацию для любого данного элемента. Например, если я добавляю новую запись POS, мне нужно иметь возможность отследить ее обратно в файле, в котором она была найдена. Если я изменю код UPC или описание продукта, то мне нужно будет отследить его в импорт (и файл), откуда пришли изменения.

Решение, которое яЯ размышляю.

Поскольку данные предоставляются мне через CSV, то яЯ работаю над идеей, что COPY будет лучшим / быстрым способом. Структура данных в файлах не совсем то, что у меня есть в базе данных (то есть конечный пункт назначения). Так что я'm копирование их в таблицы в промежуточной схеме, соответствующие CSV (примечание: одна схема на источник данных). Таблицы в промежуточных схемах будут иметь триггеры строки перед вставкой. Эти триггеры могут решить, что делать с данными (вставить, обновить или игнорировать).

Для таблиц, которые, скорее всего, содержат новые данные, он попытается вставить в первую очередь. Если запись уже существует, она вернет NULL (и остановит вставку в промежуточную таблицу). Для таблиц, которые редко меняются, он запросит таблицу и посмотрит, найдена ли запись. Если это так, то мне нужен способ увидеть, если какие-либо поля изменены. (потому что помните, мне нужно показать, что запись была изменена при импорте x из файла y) Очевидно, я могу просто набросать код и протестировать каждый столбец. Но, искал что-то немного больше "красноречивый» и более ремонтопригодны, чем это.

В некотором смысле, что яМой вид деятельности - это объединение системы импорта с системой аудита. Итак, при изучении журналов аудита я рассмотрел следующееwiki.postgresql.org статья. Кажется, что hstore может быть хорошим способом получения изменений (и возможностью легко игнорировать некоторые столбцы в таблице, которые не 't важно - например, "LAST_MODIFIED ") Я

примерно на 90% уверен, что все это будет работать ...мы создали несколько тестовых таблиц и т.д.

Мой вопрос?

Это лучший, более понятный способ решения этой задачи - найти, возможно, 3 записи из 10 КБ, требующих изменения в базе данных. Я, конечно, мог бы написать скрипт на python (или что-то еще), который читает файл и пытается выяснить, что делать с каждой записью, но это кажется ужасно неэффективным и приведет к множеству циклов.

Несколько последних вещей:

Я нене может контролировать входные файлы. Я был бы рад, если бы они только послали мне дельты, но они нет и этополностью вне моего контроля или влияния.Система развивается, и, вероятно, будут добавлены новые источники данных, которые значительно увеличат объем обрабатываемых данных (поэтому яя стараюсь держать вещи эффективными)Я знаю, что это не приятно, просто так вопрос (как "как отсортировать список в python) но я считаю, что одна из замечательных особенностей SO - это то, что вы можете задавать сложные вопросы, и люди будут делиться своими мыслями о том, как, по их мнению, лучше всего решить эту проблему.

Ответы на вопрос(1)

Ваш ответ на вопрос