Sql 从pg_转储输出中删除注释

Sql 从pg_转储输出中删除注释,sql,postgresql,postgresql-9.2,Sql,Postgresql,Postgresql 9.2,当PostgreSQLpg_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 m

当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来实现你需要的结果。创建一个测试数据库并使用它来确保获得所需的结果。此命令将生成带有注释的备份:

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
我刚刚为Postgres 11+(仍在考虑中)提交了这篇文章,它应该允许一个人在没有评论的情况下转储(直到一个理想的解决方案到位),这应该比我们使用的略胜一筹

如果有足够的声音,它甚至可能会被打回Postgres 10


[更新]


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

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

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

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

  • 在这两种情况下,它都意味着SQL文件现在只用于执行,而不用于读取

    特别是对于PostgreSQL,有一个包可以做到这一点:

    • 它删除所有注释并最小化生成的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));
        }
    });
    

    通过
    sed
    像这样引导它:
    sed-e'/^-/d'
    @LaurenzAlbe,你能发布一个最能描述你的建议的答案吗?我不知道如何使用它。你使用的是什么操作系统?@LaurenzAlbe,我正在使用CentOS 7.2和PostgreSQL 9.2。5@vitaly-t、 在我的使用案例中,它们变得很明显,文件大小也增加了。非常感谢!它将注释替换为空行,是否可以将其删除?不是很重要,但文件会更干净。这将删除该行,而不会留下空行。您看到的空行在原始转储文件中为空。使用
    sed
    命令
    /^$/d
    删除这些。好建议!但是由于它依赖于NodeJS,我今天不能使用它@Laurenz Albe的解决方案非常适合我的情况,因为它更灵活,我可以使用本机PostgreSQL和Linux命令。这是一个长期要求的功能!:-到11点了吗?在2018年1月,我没有看到它被记录下来的事实——用法:
    pg_dump——使用pg_dump(PostgreSQL)11.11(Debian 11.11-1.pgdg90+1)时没有注释
    ——没有注释
    标志存在,但实际上似乎没有做任何事情。至少在我使用的标志组合中