psql - збереження результатів команди у файл


Відповіді:


478

З довідки 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 Takur

1
Так, \o queries-output.txtперенаправлення всіх наступних команд o / p до імені файлу queries-output.txtта введення тексту \oзапиті psql знову) повертає цю поведінку перенаправлення.
гіга

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 чи ні, але загальний синтаксис відтворений із наступного посилання 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;

Дуже зручно, дякую. Але "копіювати" в "... копіювати в ..." не потрібно - адже в останніх версіях це призводить до відмови команди.
Том

Томе, я думаю, що це була помилка. Відредагував публікацію з тією, що працює на моїй установці pgsql 8.5ver
Aakash Gupta

Просто швидка примітка для тих, хто намагається вставити багаторядковий оператор після \ copy та отримати заплутані синтаксичні помилки, як я це робив. Вам потрібно продовжити в тому ж рядку, що і \ copy.
поцікавився

Чи є спосіб вимкнути \ копію? Я виявив, що якщо я запускаю оператор, як у вашому прикладі, а потім запускаю, наприклад, вибирати * від користувачів; що він додасть результати до самого останнього файлу, який я вказав замість виведення на екран. Дякую.
raphael75

6

Використовуйте параметр команди pgsql.

-o, --output = FILENAME надсилає результати запиту у файл (або | труба)

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. У вікнах це ставить файл в 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 'шлях до файлу';

Приклад

\ скопіюйте (виберіть ім'я, дату_порядку з покупки_порядок) у заголовок резюме '/home/ankit/Desktop/result.csv';

Сподіваюся, це допоможе тобі.


1

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

ОПИС Сценарій створює машинопис всіх надрукованих на вашому терміналі.


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.