2009-11-26 6 views
1

Мне нужно синхронизировать две базы данных PostgreSQL (некоторые таблицы из разработки db в db).PostgreSQL, обновлять существующие строки с помощью pg_restore

Так что я придумал этот сценарий:

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

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

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

ответ

1

ли это:

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 не обновляется и не удаляется.

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

+0

Спасибо, все. Однако мне придется делать резервную копию многих 'join tables '(с помощью' on delete cascade' FKs), но это не должно быть проблемой. – woky

+0

Не копируйте таблицы соединений - просто временно удалите все FK в эту таблицу. В противном случае вам придется резервировать ссылки на таблицы, таблицы, ссылающиеся на них, и так далее. Очень легко пропустить что-то важное. Я бы рекомендовал преобразовать все FK в «on no no action» или «on delete restrict». – Tometzky