Экспорт в CSV и сжатие с GZIP в postgres - PullRequest
24 голосов
/ 20 октября 2010

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

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

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

А затем можете сжать его, используя gzip, как -

gzip -c foo_table.csv > foo.gz

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

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

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

Ответы [ 2 ]

45 голосов
/ 21 октября 2010

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

psql -c "COPY foo_table TO stdout DELIMITER ',' CSV HEADER" \
    | gzip > foo_table.csv.gz
7 голосов
/ 21 октября 2014

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

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

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

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

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

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

...