Как сохранить вывод psql во внешний csv-файл

В ходе анализа данных в БД postgres при помощи psql, часто бывает нужно сохранить промежуточные результаты работы в файл. Сделать это можно несколькими способами, рассмотрим их по очереди.

Можно использовать встроенную postgres-команду COPY.

Copy (Select * From foo) To '/tmp/test.csv' With CSV;

Основной недостаток - команду необходимо выполнять из-под учетной записи с правами суперпользователя. 

Альтернатива - команда в клиенте командной строки psql: \copy. В этом случае все действия по сохранению информации в файл выполняются на стороне клиента. Как следует из документации, \copy вызывает COPY FROM STDIN или COPY TO STDOUT, и затем сохраняет полученные данные в файле, доступном для клиента psql.

\copy (Select * From foo) To '/tmp/test.csv' With CSV

Обратите внимание на отсутствие точки с запятой в конце выражения. Для \copy сигналом к выполнению служит символ новой строки.

Еще один вариант - при помощи все той же psql, но не интерактивно, а в командном bash-режиме:

psql -d dbname -t -A -F"," -c "select * from users" > output.csv

Или аналогичный функционал, но уже изнутри оболочки psql:

psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q

\f - устанавливаем разделитель между полями, \a - указываем на отсутствие выравнивания в формате вывода, \o - куда перенаправлять вывод.

Источник