Скопируйте базу данных через обновления/вставки и удаления в postgresql.

Я хочу, чтобы база данных постоянно обновлялась информацией, которую я извлекаю из API. Данные, которые я получаю, могут быть неполными, но у меня должна быть большая их часть. До сих пор у меня есть предложение try/except, в котором я пытаюсь вставить строку в свою базу данных и, за исключением того, что я обновляю строку. Основная проблема в том, что я не удаляю строки. Я хочу иметь копию данных сервера в любой момент времени или, по крайней мере, оставаться рядом с ним. Мне нужно как-то отслеживать строки, которые мне нужно удалить с течением времени, потому что я хочу убедиться, что не только парсер дает мне неполные данные. Кстати, я использую Python и psycopg2. Я думаю, что это распространенная проблема, но я не могу найти лучшего решения, чем создать новую базу данных, пару раз обновить ее тем, что у меня есть в настоящее время, а затем заменить базы данных. Какие-либо предложения? Мне также не нравится тот факт, что я ожидаю, что здесь часто будет срабатывать пункт исключения....

Заранее спасибо!


person Max Smith    schedule 10.01.2017    source источник


Ответы (1)


Отсутствие upsert (эквивалентно MySQL INSERT ... ON DUPLICATE KEY UPDATE) долгое время было занозой в боку Postgresql. Как правило, ваш подход - лучший способ сделать это. Однако есть проблема, заключающаяся в том, что она не является атомарной — между моментом создания исключения и попыткой обновления строка могла быть обновлена ​​другим процессом. Часто это приводит к тому, что люди создают неизменяемые строки, но это уже другая тема.

Похоже, что в Postgres 9.5 они добавили предложение Upsert. INSERT ... ON CONFLICT ... DO ... (Документация здесь).

При проведении других исследований оказалось, что здесь есть гораздо более полный ответ: https://stackoverflow.com/a/17267423/1327710.

person Ned Rockson    schedule 10.01.2017
comment
Upsert кажется хорошим, но не справляется с удалением? Также я хотел бы добавить столбец идентификатора в свою базу данных. Это будет единственная уникальная колонка, чтобы не было конфликта, чтобы огорчить? Например, данные, которые я получаю, не имеют идентификатора. Я назначу ему один, когда он будет впервые вставлен. Но тогда я думаю, мне нужно сопоставить строки и как-то вызвать конфликт для обновления? Спасибо за вашу помощь! - person Max Smith; 11.01.2017