Как экспортировать вывод запроса 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
Вероятно, это не самый эффективный механизм, но отлично работает на небольших количествах строк вывода.