Ответы:
Из справки PSQL ( \?
):
\ o [ФАЙЛ] отправить все результаты запроса в файл или | трубу
Последовательность команд будет выглядеть так:
[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal
db=>\o out.txt
db=>\dt
db=>\q
\o
снова выключает это.
\?
не идет в файл. :(
\o queries-output.txt
перенаправляет все последующие команды o / p в файл с именем queries-output.txt
и вводит \o
(при повторной подсказке psql ) это поведение перенаправления отменяется.
Команда 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 или нет, но общий синтаксис воспроизводится по следующей ссылке Синтаксис копирования SQL Postgres
\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','
Выше сохранит выходные данные запроса select в имени файла, предоставленном в виде файла csv
РЕДАКТИРОВАТЬ:
Для моего сервера psql работает следующая команда, это более старая версия v8.5
copy (select * from table1) to 'full_path_filename' csv header;
Если вы получили следующую ошибку
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
Используйте запрос ниже, чтобы сохранить результат в CSV-файле
\ скопировать (ваш запрос) в csv заголовок 'file path';
пример
\ скопируйте (выберите name, date_order из purchase_order) в '/home/ankit/Desktop/result.csv' заголовок cvs;
Надеюсь, это поможет вам.
Я предполагаю, что для этого существует какая-то внутренняя команда psql, но вы также можете запустить script
команду из пакета util-linux-ng :
ОПИСАНИЕ Script делает машинописный текст всего, что напечатано на вашем терминале.
Этот подход будет работать с любой командой psql от самой простой до самой сложной, не требуя каких-либо изменений или корректировок исходной команды.
ПРИМЕЧАНИЕ. Для серверов Linux.
МОДЕЛЬ
read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]
HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
ПРИМЕР
read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
curid INT := 0;
vdata BYTEA;
badid VARCHAR;
loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
begin
select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
into loc
from public.some_base where some_field = badid;
SELECT file||' '
INTO vdata
FROM public.some_base where some_field = badid;
exception
when others then
raise notice 'Block/PageNumber - % ',loc;
raise notice 'Corrupted id - % ', badid;
--return;
end;
end loop;
end;
$f$;
HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
МОДЕЛЬ
sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1
ПРИМЕР
sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1
cat sqlop
Готово! Спасибо! = D
Подход к докеру
через команду psql
docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
или запрос из файла sql
docker exec -i %containerid% psql -U %user% < file.sql > data.txt