PostgreSQL,使用 pg_restore 更新现有行

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 上,但恕我直言,这里是回答这个问题的更好的地方)。

答案1

答案2

在我见过的任何环境中,这通常不是逐个表地完成的。

  • 任何行都有许多可能性:SELECT / INSERT / UPDATE / ALTER ...您需要考虑所有这些可能性。

  • 表并不是数据库中唯一的东西,尤其是 PostgreSQL 数据库。序列、函数、聚合、视图等都可能需要复制。

如果我处于你的情况,我会转储整个数据库并用它来恢复干净的版本。

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

答案3

也许使用 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

相关内容