Відповіді:
З довідки 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 чи ні, але загальний синтаксис відтворений із наступного посилання Postgres SQL-синтаксис копіювання
\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','
Вищезгадане збереже результат вибору запиту у назві файлу, наданому у вигляді файлу 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 'шлях до файлу';
Приклад
\ скопіюйте (виберіть ім'я, дату_порядку з покупки_порядок) у заголовок резюме '/home/ankit/Desktop/result.csv';
Сподіваюся, це допоможе тобі.
Я припускаю, що для цього існує якась внутрішня команда psql, але ви також можете запустити script
команду з пакету util-linux-ng :
ОПИС Сценарій створює машинопис всіх надрукованих на вашому терміналі.
Цей підхід буде працювати з будь-якою командою 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