从pg_dump输出

时间:2017-01-30 17:07:36

标签: sql postgresql postgresql-9.2

当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;

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

我刚刚为 Postgres 11 + (仍在考虑中)提交了patch,这应该允许一个人在没有COMMENTS的情况下进行转储(直到一个理想的解决方案到位)应该是比我们使用的更好的kludge。

如果有足够的声音,它甚至可以重新修补到Postgres 10!

答案 2 :(得分: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或您选择的脚本引擎中执行相同的操作。

答案 3 :(得分:0)

从SQL中删除注释只有两个很好的理由:

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

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

  3. 在任何一种情况下,它都意味着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));
        }
    });