如何通过 postgres 中的存储函数压缩 CSV 文件

Posted

技术标签:

【中文标题】如何通过 postgres 中的存储函数压缩 CSV 文件【英文标题】:How to zip CSV files through stored function in postgres 【发布时间】:2019-08-23 09:46:23 【问题描述】:

我正在一个存储函数中使用来自 postgres 的 COPY 语句生成一些 CSV 文件。

CREATE OR REPLACE FUNCTION "public"."create_csv" () RETURNS INT AS
$$
BEGIN
    EXECUTE format('COPY (SELECT * FROM test) TO %L DELIMITER '','' CSV HEADER', '/tmp/test.csv');
    EXECUTE format('COPY (SELECT * FROM test2) TO %L DELIMITER '','' CSV HEADER', '/tmp/test2.csv');
RETURN 0;
END;
$$
LANGUAGE 'plpgsql' SECURITY DEFINER

这个函数是从父函数调用的,执行完之后我想将生成的 CSV 文件压缩成一个 zip 文件,我如何使用数据库中存储的函数来完成这个?有没有办法使用 plpgsql 做到这一点?还是我应该使用 plpythonu 语言? Postgres 9.6 版。 谢谢!

【问题讨论】:

您可以将复制命令的输出发送到服务器上的程序。像copy .. to program 'gzip ...' 这样的东西。手册中有一个例子postgresql.org/docs/current/sql-copy.html#id-1.9.3.55.10 您好,感谢您的回答,但不幸的是,该选项无法解决我的问题。我想要做的是,使用几个 COPY 语句生成可变数量的 CSV 文件,然后(一旦生成所有 CSV 文件),将它们全部压缩到一个 xx.zip 文件中。可以使用 TO 程序吗?还有其他选择吗?有人可以提供一个例子吗?提前致谢。 【参考方案1】:

@a_horse_with_no_name 提醒您应该做什么使用 copy ... PROGRAM,只需在函数末尾添加代码,在本例中为 tar 格式:

CREATE OR REPLACE FUNCTION "public"."create_csv" () RETURNS INT AS
$$
BEGIN
 EXECUTE format('COPY (SELECT * FROM test) TO %L DELIMITER '','' CSV HEADER', '/tmp/test.csv');
 EXECUTE format('COPY (SELECT * FROM test2) TO %L DELIMITER '','' CSV HEADER', '/tmp/test2.csv');
 --add copy commando with PROGRAM
 COPY (SELECT 1) TO PROGRAM 'tar cvf /tmp/mytarfile.tar --remove-files /tmp/*.csv';
RETURN 0;
END;
$$
LANGUAGE 'plpgsql' SECURITY DEFINER

【讨论】:

非常感谢你们(a_horse_with_no_name 和 Anthony Sotolongo),Copy PROGRAM 解决了我的问题! :)

以上是关于如何通过 postgres 中的存储函数压缩 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

Postgres存储函数如何返回表

如何在 Postgres 函数中存储日期变量?

如何存储我从 Postgres 存储函数返回的数据

Postgres:从存储函数返回结果或错误

如何将存储在 Postgres 中的图像的图像 URL 插入 Spring Boot 模型

压缩不同数据库中的字符串