【发布时间】:2021-06-16 19:27:08
【问题描述】:
以下命令运行良好
$ psql -c "copy (select * from foo limit 3) to stdout csv header"
# output
column1,column2
val1,val2
val3,val4
val5,val6
但以下不是:
$ psql -c "copy (select * from foo limit 3) to program 'gzip -f --stdout' csv header"
# output
COPY 3
为什么我有 COPY 3 作为此命令的输出?我希望在通过gzip 之后,输出将是压缩的 CSV 字符串。
下面的命令有效,例如:
$ psql -c "copy (select * from foo limit 3) to stdout csv header" | gzip -f -c
# output (this garbage is just the compressed string and is as expected)
߉T`M�A �0 ᆬ}6�BL�I+�^E�gv�ijAp���qH�1����� FfВ�,Д���}������+��
如何制作一个直接将结果通过管道传送到gzip并将压缩字符串发送到STDOUT的SQL命令?
【问题讨论】:
-
压缩流量是网络层的工作,而不是 SQL 语句的工作。它过去可以通过 OpenSSL 用于 postgres,直到压缩从 SSL 中针对security reasons 启动。您仍然可以使用压缩 VPN,但如果远程是公共云服务,则可能不会。
-
gzip'ing the traffic is the job of a network layer, not the job of SQL statements-> 这是任意的。有问题的 SSL 命令完全能够输出压缩的 gzip csv 文件,我认为这不是“他们的工作”的根本原因,而不仅仅是压缩 STDOUT 输出。 -
SQL 客户端不像
wget。在服务器关闭连接之前,它并不意味着流式传输非结构化内容。 COPY 使用逐行协议,客户端需要解释它接收到的字节。如果它们被 gzip 压缩并且协议不知道,这是不可能的。 -
@DanielVérité 我明白了,有道理。谢谢你的解释
标签: postgresql gzip psql postgresql-13