PostgreSQL, обновите существующие строки с помощью pg_restore - PullRequest
1 голос
/ 27 ноября 2009

Мне иногда нужно синхронизировать две базы данных PostgreSQL (некоторые таблицы от разработки db до производства db).

Итак, я придумал этот скрипт:

[...]
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \
pg_restore -a -U user2 -d dbname2
[...]

Проблема в том, что это работает только для вновь добавленных строк. Когда я редактирую не-PK столбец, я получаю ошибку ограничения, и строка не обновляется. Для каждой сброшенной строки мне нужно проверить, существует ли она в целевой базе данных (по PK) и, если это так, удалить ее перед INSERT / COPY.

Спасибо за советы.

1 Ответ

1 голос
/ 27 ноября 2009

Сделайте это:

pg_dump -t table1 production_database > /tmp/old_production_database_table1.sql
pg_dump -t table1 devel_database > /tmp/devel_database_table1.sql
psql production_database
truncate table1
\i /tmp/devel_database_table1.sql
\i /tmp/old_production_database_table1.sql

Вы получите много повторяющихся ошибок первичного ключа в секунду \i, но он будет делать то, что вы хотите: все строки из devel будут обновлены, все строки, не находящиеся в devel, не будут обновлены или удалены.

Если у вас есть какие-либо ссылки на table1, вам придется удалить их до и заново создать после импорта. Особенно проверяйте ссылки on delete cascade, set null или set default на table1 - вы потеряете данные в других таблицах, если они у вас есть.

...