在 postgres 中导出为 CSV 并使用 GZIP 压缩

发布于 2024-09-28 18:53:36 字数 352 浏览 4 评论 0原文

我需要将一个大表导出到 csv 文件并压缩它。

我可以使用 postgres 中的 COPY 命令将其导出,例如 -

COPY foo_table to '/tmp/foo_table.csv' delimiters',' CSV HEADER;

然后可以使用 gzip 对其进行压缩,例如 -

gzip - c foo_table.csv > >这种

方法的问题是,在获得最终的压缩文件之前,我需要创建这个中间 csv 文件,该文件本身很大。

有没有一种方法可以导出csv表格并一步压缩文件?

问候, 苏吉特

I need to export a big table to csv file and compress it.

I can export it using COPY command from postgres like -

COPY foo_table to '/tmp/foo_table.csv' delimiters',' CSV HEADER;

And then can compress it using gzip like -

gzip -c foo_table.csv > foo.gz

The problem with this approach is, I need to create this intermediate csv file, which itself is huge, before I get my final compressed file.

Is there a way of export table in csv and compressing the file in one step?

Regards,
Sujit

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

天气好吗我好吗 2024-10-05 18:53:36

诀窍是让 COPY 将其输出发送到 stdout,然后通过 gzip 传输输出:

psql -c "COPY foo_table TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz

The trick is to make COPY send its output to stdout, then pipe the output through gzip:

psql -c "COPY foo_table TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz
诺曦 2024-10-05 18:53:36

您可以根据文档直接使用 https://www.postgresql.org/文档/9.4/sql-copy.html

COPY foo_table to PROGRAM 'gzip > /tmp/foo_table.csv' delimiter ',' CSV HEADER;

You can use directly, as per docs, https://www.postgresql.org/docs/9.4/sql-copy.html

COPY foo_table to PROGRAM 'gzip > /tmp/foo_table.csv' delimiter ',' CSV HEADER;
尴尬癌患者 2024-10-05 18:53:36

下面对 @Joey 的答案进行了一些扩展,添加了对 手册

psql -c "COPY \"Foo_table\" (column1, column2) TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz

如果你的表名中有大写字母(你有祸了),你需要在表名前后添加 \"

我添加的第二件事是列列表。

另请注意文档:

此操作不如 SQL COPY 命令高效,因为所有数据都必须通过客户端/服务器连接。对于大量数据,SQL 命令可能更合适。

Expanding a bit on @Joey's answer, below adds support for a couple more features available in the manual.

psql -c "COPY \"Foo_table\" (column1, column2) TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz

If you have capital letters in your table name (woe be onto you), you need the \" before and after the table name.

The second thing I've added is column listing.

Also note from the docs:

This operation is not as efficient as the SQL COPY command because all data must pass through the client/server connection. For large amounts of data the SQL command might be preferable.

贱贱哒 2024-10-05 18:53:36

PostgreSQL 13.4

psql 命令 \copy 还可以与 SELECT column_1、column_2、... 和时间戳 结合使用>date +"%Y-%m-%d_%H%M%S" 用于文件名转储。

\copy (SELECT id, column_1, column_2, ... FROM foo_table) \ 
TO PROGRAM 'gzip > ~/Downloads/foo_table_dump_`date +"%Y-%m-%d_%H%M%S"`.csv.gz' \
DELIMITER ',' CSV HEADER ;

PostgreSQL 13.4

psql command \copy also works combined with SELECT column_1, column_2, ... and timestamp date +"%Y-%m-%d_%H%M%S" for filename dump.

\copy (SELECT id, column_1, column_2, ... FROM foo_table) \ 
TO PROGRAM 'gzip > ~/Downloads/foo_table_dump_`date +"%Y-%m-%d_%H%M%S"`.csv.gz' \
DELIMITER ',' CSV HEADER ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文