PostgreSQL,使用 pg_restore 更新现有行

发布于 2024-08-12 05:07:43 字数 325 浏览 6 评论 0原文

有时我需要同步两个 PostgreSQL 数据库(一些表从开发数据库到生产数据库)。

所以我想出了这个脚本:

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

问题是这仅适用于新添加的行。当我编辑非 PK 列时,出现约束错误并且行未更新。对于每个转储的行,我需要检查它是否存在于目标数据库中(通过 PK),如果存在,则在 INSERT/COPY 之前将其删除。

感谢您的建议。

I need to sync two PostgreSQL databases (some tables from development db to production db) sometimes.

So I came up with this script:

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

The problem is that this works just for newly added rows. When I edit non-PK column I get constraint error and row isn't updated. For each dumped row I need to check if it exists in destination database (by PK) and if so delete it before INSERT/COPY.

Thanks for advices.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

彻夜缠绵 2024-08-19 05:07:43

这样做:

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 的任何引用,那么您必须在导入之前删除它们并在导入后重新创建它们。特别是检查删除级联set nullset default对table1的引用 - 如果你有这些,你会丢失其他表中的数据。

Do this:

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

You'll get a lot of duplicate primary key errors on second \i, but it'll do what you want: all rows from devel will be updated, all rows not in devel will not be updated nor deleted.

If you have any references to table1 then you'll have to drop them before and recreate them after importing. Especially check for on delete cascade, set null or set default references to table1 - you'd loose data in other tables if you have those.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文