从 pg_dump 输出中删除注释

Removing comments from pg_dump output

当 PostgreSQL pg_dump 完成后,它会为每个元素插入一些注释,如下所示。

--
-- Name: my_table; Type: TABLE; Schema: account; Owner: user; Tablespace:
--

CREATE TABLE my_table(
    id integer
);

--
-- Name: my_seq; Type: SEQUENCE; Schema: account; Owner: user
--

CREATE SEQUENCE my_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

是否可以强制pg_dump删除(排除)它们?我只想收到:

CREATE TABLE my_table(
    id integer
);

CREATE SEQUENCE my_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

Marcio,管道是将一个过程的输出直接输入另一个过程以实现特定目的的过程。 假设您使用 Julia 来实现您需要的结果。创建一个测试数据库并使用它来确保您获得所需的结果。这个 Julia 命令会生成一个带有注释的备份:

run(pipeline(`pg_dump -d test`,"testdump.sql"))

这里要求 Julia 将备份转储到 testdump.sql,以便我们可以检查结果。注意反引号。然后是另一个使用@LaurenzAlbe 建议的过滤器的命令:

run(pipeline(`cat testdump.sql`,`sed -e '/^--/d'`,"testdump2.sql"))

这里我们有一个三部分管道,它扫描带有评论的备份,去除评论并将剩余的内容转储到 testdump2 中。您现在可以检查第一个和第二个文件是否是必需的。

一旦您确信@LaurenzAlbe 提供的解决方案是正确的,您就可以在一个管道命令中对 运行 整个内容进行所需的替换。当然,您可以直接在 bash 终端或 Python 或您选择的脚本引擎中执行相同的操作。

在 UNIX 类型的操作系统上,我会这样做:

pg_dump [options] mydatabase | sed -e '/^--/d' >mydatabase.dmp

这可能会意外吞下以 -- 开头的数据行。要解决该问题,请使用 pg_dump--inserts 选项。

我刚刚为 Postgres 11+ 提交了这个 patch(仍在考虑中),应该允许在没有评论的情况下转储(直到找到理想的解决方案) place) 这应该比我们使用的那些稍微好一点。

如果有足够多的声音,它甚至可能会返回到 Postgres 10!


[更新]

现在这是 Postgres v11+ 中的一项功能

从 SQL 中删除评论只有 2 个很好的理由:

  1. SQL 文件包含需要动态替换的格式化变量(占位符)。在这种情况下,删除注释可防止在注释中引用这些变量时检测到错误的变量。

  2. SQL 文件将被最小化,以减少需要通过 IO 进入数据库服务器的文件的大小。

在任何一种情况下,这都意味着 SQL 文件现在仅用于执行,而不用于读取。

并且专门针对 PostgreSQL,有一个包 pg-minify 可以做到这一点:

  • 它删除了所有评论并最小化了结果 SQL
  • 它可以选择将 SQL 压缩到最低限度(选项 compress

完整示例

const minify = require('pg-minify');
const fs = require('fs');

fs.readFile('./sqlTest.sql', 'utf8', (err, data) => {
    if (err) {
        console.log(err);
    } else {
        console.log(minify(data));
    }
});