Назад | Перейти на главную страницу

PostgreSQL, обновите существующие строки с помощью pg_restore

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

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

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

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

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

(Ранее размещалось на stackoverflow.com, но, IMHO, это лучшее место для этого вопроса).

Может быть, используя dblink и вставляя только то, что вам нужно из выбора?

http://www.postgresonline.com/journal/index.php?/archives/44-Using-DbLink-to-access-other-PostgreeSQL-Databases-and-Servers.html
http://www.postgresql.org/docs/current/static/dblink.html

В любой среде, которую я видел, это обычно не делается для каждой таблицы.

  • Для любой строки есть несколько возможностей: SELECT / INSERT / UPDATE / ALTER ... вам нужно будет позаботиться обо всех этих возможностях.

  • Таблицы - не единственное, что живет в базах данных, особенно в базах данных PostgreSQL. Возможно, потребуется скопировать все последовательности, функции, агрегаты, представления и т. Д.

Если бы я был в вашей ситуации, я бы сбросил всю базу данных и использовал ее для восстановления чистой версии.

pg_dump --clean --no-owner --no-privileges dbname ## other pg_dump / psql options