如何在Psql输出中隐藏结果集修饰


78

如何隐藏psql输出中的列名和行数?

我正在通过psql使用以下命令运行SQL查询:

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做到这一点呢?阅读其手册页后,我看到了用于控制字段定界符的选项,但是没有任何东西可以隐藏无关的输出。

Answers:


98

您可以使用-t--tuples-only选项:

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

编辑(一年后)以添加:

您可能还需要检查COPY命令。我不再需要测试任何PostgreSQL实例,但是我认为您可以按照以下方式编写:

psql --user = myuser -d mydb -c“将mytable复制到'result.txt'DELIMITER','”

(除非这result.txt需要是一条绝对路径)。该COPY命令还支持更智能的CSV格式。请参阅其文档


24
或者,如果您想要页眉而不是行数页脚,请使用--pset =“ footer = off”运行psql
Gabriel Burt

3
COPY确实可以是一个有效的替代方法,但是该文件将最终存储在服务器上,而不是运行psql的计算机上……
fvu 2015年

@fvu:好点。我通常psql 服务器运行,所以对我来说这不是问题。。。
ruakh 2015年

如果您希望文件最终出现在客户端文件系统上,请使用psql的\ COPY(即,在COPY命令前添加反斜杠)
Alex Bitek

3
我认为@GabrielBurt评论应该是一个独立的答案。这正是我要生成带有标题但没有令人讨厌的(nnnn rows)页脚的csv的目的。
皮埃尔·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调用的示例:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.