Подтвердить что ты не робот

Как скрыть украшение набора результатов в выходе Psql

Как вы скрываете имена столбцов и число строк в выводе 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? Чтение его man-страницы, я вижу варианты управления полевым разделителем, но ничего не скрывает посторонний выход.

4b9b3361

Ответ 1

Вы можете использовать опцию -t или --tuples-only:

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

Отредактировано (более года спустя) , чтобы добавить:

Вы также можете проверить команду COPY. У меня больше нет экземпляров PostgreSQL, с которыми можно было бы протестировать, но я думаю, что вы можете написать что-то в этих строках:

psql --user=myuser -d mydb -c "COPY mytable TO 'result.txt' DELIMITER ','"

(за исключением того, что result.txt должен быть абсолютным путем). Команда COPY также поддерживает более интеллектуальный формат CSV; см. его документацию.

Ответ 2

Вы также можете перенаправить вывод из 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"