将 COPY 命令的文件结果插入 table
Insert COPY command's file result into a table
我有一个 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之前压缩它?
由于目前仅使用 COPY
是不可能的,您必须求助于外部文件处理。
这是一个使用 large object functions 将文件数据放入单个 table 条目的版本:
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
。
我有一个 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之前压缩它?
由于目前仅使用 COPY
是不可能的,您必须求助于外部文件处理。
这是一个使用 large object functions 将文件数据放入单个 table 条目的版本:
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
。