psql-сохранение результатов команды в файл


Я использую psql dt чтобы перечислить все таблицы в базе данных, и мне нужно сохранить результаты.

каков синтаксис для экспорта результатов команды psql в файл?

6 185

6 ответов:

из справки psql (\?):

\o [FILE] отправить все результаты запроса в файл или |pipe

последовательность команд будет выглядеть так:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q

[wist@scifres ~]$ 

psql \o команда уже была описана jhwist.

альтернативный подход-использование COPY TO команда для записи непосредственно в файл на сервере. Это имеет то преимущество, что он сбрасывается в удобном для анализа формате по вашему выбору, а не в табличном формате psql. Это также очень легко импортировать в другую таблицу/базу данных с помощью COPY FROM.

NB! Это требует привилегий суперпользователя и будет записывать в файл на сервер.

пример: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

создает CSV-файл с ';' в качестве разделителя полей.

как всегда подробности см. В документации

\copy который является командой postgres может работать для любого пользователя. Не знаю, работает ли он для \dt или нет, но общий синтаксис воспроизводится по следующей ссылке Postgres SQL copy syntax

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

выше будет сохранен вывод запроса select в имени файла, предоставленного в виде файла csv

EDIT:

для моего сервера psql работает следующая команда это более старая версия v8. 5

copy (select * from table1) to 'full_path_filename' csv header;

Я предполагаю, что для этого существует какая-то внутренняя команда psql, но вы также можете запустить с util-linux-ng:

описание Скрипт делает машинопись всего, что печатается на вашем терминале.

Если вы получили следующую ошибку ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';') ; ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

вы можете запустить его таким образом:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; эта команда используется для хранения всей таблицы в формате csv