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


Ответы:


479

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

\ o [ФАЙЛ] отправить все результаты запроса в файл или | трубу

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

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

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

1
я могу назвать это до \ dt или в комбинации? пожалуйста, включите синтаксис спасибо.
— pstanton

118
Печатание \oснова выключает это.
— Карл Дж.

3
К сожалению, вывод \?не идет в файл. :(
— blitzen9872

за ваше любопытное разрешение отказано говорит, что попробуйте запустить psql от имени администратора
— Ajay

1
Да, \o queries-output.txtперенаправляет все последующие команды o / p в файл с именем queries-output.txtи вводит \o(при повторной подсказке psql ) это поведение перенаправления отменяется.
— Hygull

95

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

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

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

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

Создает файл CSV с помощью ';' в качестве разделителя полей.

Как всегда, см. Документацию для деталей


Я согласен, @helvete, представленный здесь подход предоставляет пользователю больше возможностей для настройки вывода более настраиваемым способом
— Натан Бентон

27

\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;

Очень удобно, спасибо. Но «копировать» в «... копировать в ...» не требуется - фактически в последних версиях это приводит к сбою команды.
— Том

Том, я думаю, это была опечатка. Отредактировал пост с тем, который работает на моей установке pgsql 8.5ver
— Aakash Gupta

Просто быстрое примечание для любого, кто пытается вставить многострочный оператор после \ copy и получает запутанные синтаксические ошибки, как я только что сделал. Вы должны продолжить в той же строке, что и \ copy.
— просил

Есть ли способ отключить \ копирование? Я обнаружил, что если я запускаю оператор, как в вашем примере, а затем запускаю, например, select * from users; что он добавит результаты к самому последнему указанному мной файлу вместо вывода на экран. Спасибо.
— Raphael75

6

Используйте параметр o команды pgsql.

-o, --output = FILENAME отправлять результаты запроса в файл (или | pipe)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt

3

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


В postgres COPY лучше заменить на \ COPY, чтобы избежать необходимости в db admin. В окнах это ставит файл в C: \ TMP
— Jan

3

Если вы получили следующую ошибку 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


2

Используйте запрос ниже, чтобы сохранить результат в CSV-файле

\ скопировать (ваш запрос) в csv заголовок 'file path';

пример

\ скопируйте (выберите name, date_order из purchase_order) в '/home/ankit/Desktop/result.csv' заголовок cvs;

Надеюсь, это поможет вам.


1

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

ОПИСАНИЕ Script делает машинописный текст всего, что напечатано на вашем терминале.


0

Этот подход будет работать с любой командой 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


0

Подход к докеру

через команду psql

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

или запрос из файла sql

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.