Как экспортировать вывод запроса PostgreSQL в файл csv

У меня возникла проблема с экспортом моего вывода PostgreSQL из оболочки в файл csv.
Мой SQL script называется script.sql.

В командной строке я ввел следующую команду:

psql congress -af script.sql &> filename.csv

Но когда я открыл файл filename.csv, значения всех столбцов были сжаты в одном столбце в Excel csv (см. прикрепленный снимок экрана).

Тогда я попробовал другой путь. Я отредактировал мой script.sql следующим образом:

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

Затем я ввел следующую команду в оболочку в базе данных dbname.

\i script.sql

Вывод:

COPY 162

Ну, мой выходной запрос имеет 162 строки.

Итак, 162 строки моей выходной таблицы были скопированы в оболочку. Как вставить или переместить их в файл csv?

Или, если я собираюсь использовать файл filename.csv(скриншот прилагается), как я могу исправить формат этого файла csv/Excel?

Screenshot of filename.csv

Ответ 1

Современный синтаксис:

COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);

Итак, 162 строки моей выходной таблицы были скопированы в оболочку. Как можно ли вставить или переместить их в файл csv?

Результат - CSV файл. Откройте его с помощью любой программы для работы с электронными таблицами, используя соответствующие разделители. В документации:

По умолчанию используется символ табуляции в текстовом формате, запятая в формате CSV

Как комментарий Патрика, вы можете использовать соответствующую мета-команду psql \copy аналогичным образом. Он записывает (и читает) файлы, локальные для клиента, и не требует привилегий суперпользователя.

Больше объяснений в этих смежных ответах:

Ответ 2

сначала скопируйте информацию о подключении в ~/.pgpass и

cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz

Ответ 3

Уходя на немного касательной, есть и другой способ.

Я использую следующее в пакете windows script: -

psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name   FROM information_schema.tables WHERE table_schema = '%qSchema%';"

Трюк заключается в том, чтобы запомнить опцию -A. Он подавляет пробельные пробелы данных.

Я делаю это, чтобы избежать ошибок разрешения из команды COPY, показанной выше, с учетной записью, выполняющей postgress, не имеют тех же разрешений, что и учетная запись, запускающая мой запланированный пакетный файл.

Это дает мне список таблиц в данной схеме с такими результатами, как: -

MySchema | mytable1

MySchema | mytable2

Затем я использую командную команду FOR для обработки каждой строки. Если вы ДЕЙСТВИТЕЛЬНО хотите CSV файл, все, что вам нужно сделать, будет следующим: -

ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv

Вероятно, это не самый эффективный механизм, но отлично работает на небольших количествах строк вывода.