我有一个postgresql函数,可以创建如下的csv文件。
CREATE FUNCTION public.exportsnapshot()
RETURNS void AS $$
LANGUAGE 'plpgsql'
BEGIN
COPY (my_query) TO 'tmp/test.csv' With DELIMITER ';' CSV HEADER;
END; $BODY$;
有没有一种方法可以直接从COPY命令将test.csv文件插入bytea列?另外,有没有办法在将其保存到bd之前对其进行压缩?
答案 0 :(得分:0)
由于目前仅使用COPY
是不可能的,因此您必须求助于外部文件处理。
以下是使用large object functions将文件数据存储到单个表条目中的版本:
CREATE TABLE snapshots (
id serial primary key,
data bytea
);
CREATE FUNCTION exportsnapshot()
RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
data_file_id oid;
snapshot_id integer;
BEGIN
COPY (my_query) TO '/tmp/test.csv' With DELIMITER ';' CSV HEADER;
-- assign an OID to the external file...
SELECT lo_import('/tmp/test.csv') INTO STRICT data_file_id;
-- create a new snapshots entry by reading the complete file contents...
INSERT INTO snapshots (data)
SELECT lo_get(data_file_id)
RETURNING id
INTO snapshot_id;
-- forget about the external file...
PERFORM lo_unlink(data_file_id);
-- delete the file...
COPY (SELECT 1) TO PROGRAM 'rm /tmp/test.csv';
-- return the new snapshot ID...
RETURN snapshot_id;
END;
$$;
对于压缩,您应该真正考虑使用text
而不是bytea
。