Вставить результат файла команды COPY в таблицу - PullRequest
1 голос
/ 16 апреля 2019

У меня есть функция 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$;

Есть ли способ вставить файл test.csv в столбец bytea непосредственно из команды COPY? Кроме того, есть ли способ сжать его перед сохранением на диск?

1 Ответ

0 голосов
/ 19 апреля 2019

Поскольку на данный момент невозможно использовать только COPY, вам придется прибегнуть к обработке внешних файлов.

Вот версия, которая использует функции больших объектов для получения данных файла в одной записи таблицы:

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.

...