11

Сохранение вывода PL/pgSQL из PostgreSQL в CSV файл

12

Наилучший способ сохранить вывод PL/pgSQL из базы данных PostgreSQL в CSV-файл?

Я использую PostgreSQL 8.4 с pgAdmin III и плагином PSQL, через который выполняю запросы. Необходимо экспортировать результаты выполнения функции PL/pgSQL в CSV-файл, но не знаю, как это сделать наиболее простым способом. Есть ли готовые решения или рекомендации по этому процессу?

5 ответ(ов)

6

Есть несколько решений:

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, но этот вариант не вписывается в сценарии.

1

Чтобы сохранить вывод запроса в терминале (при подключении к базе данных) в файл формата CSV, выполните следующие шаги:

  1. Установите разделитель полей на ',':

    \f ','
    
  2. Установите формат вывода как неразметка:

    \a
    
  3. Показывайте только кортежи (строки данных):

    \t
    
  4. Установите файл вывода:

    \o '/tmp/yourOutputFile.csv'
    
  5. Выполните ваш запрос:

    SELECT * FROM YOUR_TABLE;
    
  6. Завершите вывод в файл:

    \o
    

Теперь вы сможете найти ваш CSV-файл в указанной директории:

cd /tmp

Скопируйте его, используя команду scp, или отредактируйте с помощью nano:

nano /tmp/yourOutputFile.csv

Эти шаги позволят вам успешно экспортировать данные из базы данных в CSV файл. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

0

Если вас интересуют все столбцы определённой таблицы вместе с заголовками, вы можете использовать следующую команду:

COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;

Это немного проще, чем

COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;

На сколько мне известно, оба варианта эквивалентны.

0

Вы получили сообщение об ошибке:

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. Теперь у вас есть доступ к данным без проблем с разрешениями.

0

Вы можете использовать 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь