如何仅针对表而不针对触发器和函数执行 pg_dump?

Posted

技术标签:

【中文标题】如何仅针对表而不针对触发器和函数执行 pg_dump?【英文标题】:How to do a pg_dump for only tables only and not triggers and functions? 【发布时间】:2021-03-07 23:25:48 【问题描述】:

我想要什么: 我想要一个数据库的 pg_dump(我们称数据库为“测试”)。 在这个 pg_dump 中,我只想要表没有以下内容:数据、触发器、函数、序列等。

我正在做什么来得到我想要的: 我运行的命令如下:

pg_dump -U postgres -s test > dump_test.sql

我所观察到的: 然后,当我尝试在另一台服务器上恢复此转储时,如下所示:

pg_dump -U postgres new_amazing_test < dump_test.sql

我注意到运行上述命令的部分输出内容如下:

CREATE TRIGGER
CREATE FUNCTION
CREATE SEQUENCE
CREATE INDEX

我真正想要的: 我想要的只是表本身,而不是这些触发器、函数、序列和索引。我如何只获取表格?

我尝试过/考虑过的其他事情:

    我试过这样做:

    pg_dump -U postgres -s -schema=\dtmvE test > dump_test.sql
    

    但它不起作用,因为模式需要是名称而不是 \d 模式。 有关-n pattern 选项的信息,请参见此处:https://www.postgresql.org/docs/13/app-pgdump.html

    可以解决它的一件事是使用多个这样的开关:

    pgdump -t mytable1 -t mytable2 -t mytable3 ... -t mytableN > dump_test.sql
    

    但是,上述解决方案是不切实际的,因为我的数据库中有大约 70 多个表。

其他相关信息: PostgreSQL 版本为 13.1 Ubuntu 版本 v16.04(我也在 Ubuntu v18.04 上试过这个)

【问题讨论】:

@LaurenzAlbe 请救救我。 您可以编写一个 bash 脚本来遍历您想要的所有表。使用SELECT relname FROM pg_class WHERE relkind = 'r' AND &lt;some_other_condition&gt; 生成表格列表。然后使用您的“多开关”方法生成转储文件 【参考方案1】:

我将使用自定义格式仅模式转储 (-F c -s) 转储所有内容,并在结果转储上运行 pg_restore -l。这给了你一个目录。从该文件中删除除表格之外的所有内容,并将其用作pg_restore -L 的输入,以便从存档中准确恢复您需要的那些项目。

这可能不像您希望的那么简单,但它肯定比编写大量 -t 选项更简单,并且您可以将其自动化。

【讨论】:

以上是关于如何仅针对表而不针对触发器和函数执行 pg_dump?的主要内容,如果未能解决你的问题,请参考以下文章

delaysContentTouches 仅针对特定元素而不进行子类化?

didEnterRegion 方法仅针对最近的区域触发

仅针对特定分支的 gitlab 触发管道

如何仅针对工作执行应用程序优化 build.xml 文件

UITapGestureRecognizer 仅针对 UIScrollView 的起始区域触发

GraphQL/Prisma 订阅仅针对 DELETE 触发