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.