Сохранение вывода PL/pgSQL из PostgreSQL в CSV файл
Наилучший способ сохранить вывод PL/pgSQL из базы данных PostgreSQL в CSV-файл?
Я использую PostgreSQL 8.4 с pgAdmin III и плагином PSQL, через который выполняю запросы. Необходимо экспортировать результаты выполнения функции PL/pgSQL в CSV-файл, но не знаю, как это сделать наиболее простым способом. Есть ли готовые решения или рекомендации по этому процессу?
5 ответ(ов)
Есть несколько решений:
1 Команда psql
psql -d dbname -t -A -F"," -c "select * from users" > output.csv
У этого метода есть важное преимущество: его можно использовать через SSH, например, ssh postgres@host command
, что позволяет получить результат непосредственно на вашем локальном компьютере.
2 Команда copy
PostgreSQL
COPY (SELECT * from users) To '/tmp/output.csv' With CSV;
3 Интерактивный режим psql
(или не интерактивный)
> psql dbname
psql> \f ','
psql> \a
psql> \o '/tmp/output.csv'
psql> SELECT * from users;
psql> \q
Все эти методы можно использовать в скриптах, но я предпочитаю первый вариант.
4 pgAdmin, но этот вариант не вписывается в сценарии.
Чтобы сохранить вывод запроса в терминале (при подключении к базе данных) в файл формата CSV, выполните следующие шаги:
Установите разделитель полей на
','
:\f ','
Установите формат вывода как неразметка:
\a
Показывайте только кортежи (строки данных):
\t
Установите файл вывода:
\o '/tmp/yourOutputFile.csv'
Выполните ваш запрос:
SELECT * FROM YOUR_TABLE;
Завершите вывод в файл:
\o
Теперь вы сможете найти ваш CSV-файл в указанной директории:
cd /tmp
Скопируйте его, используя команду scp
, или отредактируйте с помощью nano
:
nano /tmp/yourOutputFile.csv
Эти шаги позволят вам успешно экспортировать данные из базы данных в CSV файл. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!
Если вас интересуют все столбцы определённой таблицы вместе с заголовками, вы можете использовать следующую команду:
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
Это немного проще, чем
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
На сколько мне известно, оба варианта эквивалентны.
Вы получили сообщение об ошибке:
ERROR: could not open file "/filepath/places.csv" for writing: Permission denied
Это означает, что у вас не было прав на запись в указанный файл. В таком случае, использование команды \COPY
является правильным решением.
Команда \COPY
выполняется на стороне клиента и не требует прав на запись на сервере базы данных. В вашем случае команда выглядит следующим образом:
\COPY (SELECT address, zip FROM manjadata) TO '/filepath/places.csv' WITH CSV;
Эта команда успешно экспортирует данные из таблицы manjadata
в файл places.csv
. Теперь у вас есть доступ к данным без проблем с разрешениями.
Вы можете использовать psql
для выполнения данного запроса. Вот пример команды:
edd@ron:~$ psql -d beancounter -t -A -F"," \
-c "select date, symbol, day_close " \
"from stockprices where symbol like 'I%' " \
"and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$
Здесь используются следующие параметры:
-d
указывает базу данных, к которой вы подключаетесь (в данном случаеbeancounter
).-t
убирает заголовки колонок из результата.-A
выводит данные в безформатном (ASCII) виде, что делает вывод компактным.-F","
задает разделитель полей (в данном случае запятая).
Чтобы получить больше информации о параметрах и командах psql
, вы можете обратиться кDocumentation команд, набрав man psql
.
Как конкатенировать текст из нескольких строк в одну строку в SQL Server
Выбрать первую строку в каждой группе GROUP BY?
Как вывести список таблиц в файле базы данных SQLite, открытом с помощью ATTACH?
Запись DataFrame pandas в CSV файл
Как вывести сырой SQL-запрос в виде строки из билдера запросов?