Як приховати прикрасу набору результатів у виведенні Psql


79

Як приховати назви стовпців і підрахунок рядків у вихідних даних із psql?

Я запускаю запит SQL через psql за допомогою:

psql --user=myuser -d mydb --output=result.txt -c "SELECT * FROM mytable;"

і я очікую на результат, як:

1,abc
2,def
3,xyz

але замість цього я отримую:

id,text
-------
1,abc
2,def
3,xyz
(3 rows)

Звичайно, неможливо відфільтрувати два верхні рядки і нижній ряд по факту, але чи є це спосіб зробити це лише за допомогою psql? Читаючи його сторінку, я бачу варіанти управління роздільником поля, але нічого для приховування сторонніх результатів.

Відповіді:


100

Ви можете використовувати параметр -tабо --tuples-only:

psql --user = myuser -d mydb --output = result.txt -t -c "SELECT * FROM mytable;"

Відредаговано (більше року тому), щоб додати:

Ви також можете перевірити на COPYкоманду . Я більше не маю жодного екземпляра PostgreSQL, зручного для тестування, але я думаю, що ви можете написати щось у таких напрямках:

psql --user = myuser -d mydb -c "КОПІЮВАТИ таблицю в 'result.txt' DELIMITER ','"

(за винятком того result.txt, що потрібно мати абсолютний шлях). COPYКоманда також підтримує більш-інтелектуальний формат CSV; дивіться його документацію .


24
Або ж, якщо ви хочете верхній колонтитул, але не нижній колонтитул підрахунку рядків, запустіть psql з --pset = "footer = off"
Габріель Берт,

3
COPYдійсно може бути допустимою альтернативою, але файл потраплятиме на сервер, а не на машину, де запущений psql ...
fvu

@fvu: Гарна думка. Зазвичай я працював psql на сервері, тому для мене це не було проблемою. . .
ruahh

Якщо ви хочете, щоб файл потрапив у клієнтську файлову систему, використовуйте psql \ COPY (тобто додайте зворотну скісну риску перед командою COPY)
Alex Bitek,

3
Я думаю, що коментар @GabrielBurt заслуговує на окрему відповідь. Це саме те, що я шукав, щоб створити CSV із заголовком, але без настирливого " (nnnn rows)" нижнього колонтитула.
Pierre D

22

Ви також можете перенаправити висновок з psql і скористатися тим самим параметром. Використовуйте \ o для встановлення вихідного файлу, а \ t для виведення лише кортежів (або \psetдля вимкнення лише "нижнього колонтитула" кількості рядків).

\o /home/flynn/queryout.txt
\t on
SELECT * FROM a_table;
\t off
\o

Як варіант,

\o /home/flynn/queryout.txt
\pset footer off
. . .

3

зазвичай, коли ви хочете проаналізувати згенерований psql вихід, ви хочете встановити -Aі -F...

    # generate t.col1, t.col2, t.col3 ...
    while read -r c; do test -z "$c" || echo  , $table_name.$c  | \
       perl -ne 's/\n//gm;print' ; \
       done < <(cat << EOF | PGPASSWORD=${postgres_db_useradmin_pw:-} \
       psql -A -F  -v -q -t -X -w -U \
       ${postgres_db_useradmin:-} --port $postgres_db_port --host $postgres_db_host -d \
       $postgres_db_name -v table_name=${table_name:-}
    SELECT column_name
    FROM information_schema.columns
    WHERE 1=1
    AND table_schema = 'public'
    AND table_name   =:'table_name'  ;
    EOF
    )
    echo -e "\n\n"

Ви можете знайти приклад повного виклику bash тут :

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.