Подтвердить что ты не робот

Экспорт в CSV и сжатие с помощью GZIP в postgres

Мне нужно экспортировать большую таблицу в файл csv и сжать ее.

Я могу экспортировать его с помощью команды COPY из postgres like -

COPY foo_table to '/tmp/foo_table.csv' delimiters',' CSV HEADER;

А потом можно сжать его с помощью gzip like -

gzip -c foo_table.csv > foo.gz

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

Есть ли способ экспортировать таблицу в csv и сжать файл за один шаг?

С уважением, Sujit

4b9b3361

Ответ 1

Хитрость заключается в том, чтобы сделать COPY отправить свой вывод на stdout, затем передать вывод через gzip:

psql -c "COPY foo_table TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz

Ответ 2

Развернув бит в ответ @Joey, ниже добавлена ​​поддержка еще нескольких функций, доступных в руководстве.

psql -c "COPY \"Foo_table\" (column1, column2) TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz

Если у вас есть заглавные буквы в имени вашей таблицы (горе вам надобно), вам нужно \" до и после имени таблицы.

Второе, что я добавил, это список столбцов.

Также обратите внимание на документы:

Эта операция не так эффективна, как команда SQL COPY, потому что все данные должны проходить через соединение клиент/сервер. Для больших объемов данных команда SQL может быть предпочтительной.