如何通过 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 文件的主要内容,如果未能解决你的问题,请参考以下文章