没有对象注释的pg_dump?

5

有没有一种方法执行pg_dump并排除表/视图和列的COMMENT ON?

我广泛使用COMMENT ON命令来描述所有对象,并经常在其中包含换行符以获得更清晰的描述,例如:

COMMENT ON TABLE mytable1 IS 'MAIN TABLE...
NOTES:
1. ...
2. ...
3. ...
';

然而,由于转储文件中也有换行符,因此我不能仅使用grep -v 'COMMENT ON'命令删除注释。

还有其他快速从转储文件中删除这些COMMENT ON的方法吗?


1
我认为使用 pg_dump 不可能实现这个。 - user330315
可能的解决方案是:恢复备份,找到所有注释并删除它们,创建新的备份。您可以使用动态SQL和元数据查询来查找和删除所有注释。 - Ihor Romanchenko
一个更智能的 sedperl 脚本可以做到这一点,因为 COMMENT ON 的语法非常简单。你只需要确保正确解析字符串转义,并忽略像 COMMENT ON ... 'It''s alright'; 这样的情况中的双引号即可。 - Craig Ringer
3个回答

5

3
据我所知,pg_dumppg_restore都没有删除COMMENT的选项。但是,如果您使用二进制转储格式,例如:
 $ pg_dump -Fc <your connection> -f /path/to/backup.dump

您可以提取目录条目并进行编辑:
 $ pg_restore -l -f /path/to/backup.toc /path/to/backup.dump

以上命令将提取 TOC 文件并保存到 /path/to/backup.toc,然后您可以找到每行带有 COMMENT 条目并删除或注释它。如果您的对象名称不奇怪,使用简单的 sed 命令即可解决问题,如下所示(分号表示注释):

$ sed -i 's/^\(.* COMMENT .*\)/;\1/g' bar.toc

有了这个新的 TOC 文件,你现在可以使用 pg_restore 来恢复你的转储文件(使用 -L 选项):

$ pg_restore -L /path/to/backup.toc -d <your database> /path/to/backup.dump

这个创建目录并使用修改后的目录进行恢复的解决方案真的很好!谢谢!甚至不需要使用 sed,因为可以通过我的编辑器修改目录。 - Arian Faurtosh

2
我会使用两阶段的转储和恢复来完成这个任务。
  1. 使用 createdb -TCREATE DATABASE WITH TEMPLATE 将数据库转储并还原为原样,或者从旧数据库创建一个新的数据库。

  2. 运行以下命令:

    Delete from pg_description;
    
  3. 将该数据库转储并还原。这将确保您没有任何烦人的依赖项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接