【问题标题】:Insert COPY command's file result into a table将 COPY 命令的文件结果插入表中
【发布时间】:2019-09-06 13:44:37
【问题描述】:

我有一个 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 FROM
  • 我希望我可以在没有中间文件的情况下做到这一点。我正在尝试COPY fileTable FROM (COPY (qurey) TO STDOUT)) 之类的东西,但我无法弄清楚
  • 所以你想把它复制到一个文件中,然后把它放在一个表中,在一个命令中?
  • 是的,我想避免在文件进入数据库后删除文件
  • insert into filetable select t::text from ( ... your query ..) t 怎么样? - 这将在filetable 中为your query 返回的每一行创建一行以逗号分隔的值

标签: postgresql bytea postgresql-copy


【解决方案1】:

由于目前仅使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2021-10-26
    • 1970-01-01
    • 2020-02-15
    • 2016-01-31
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多