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

Cer*_*rin 66 sql postgresql

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

我正在通过psql运行SQL查询:

psql --user=myuser -d mydb --output=result.txt -c "SELECT * FROM mytable;"
Run Code Online (Sandbox Code Playgroud)

我期待输出像:

1,abc
2,def
3,xyz
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

id,text
-------
1,abc
2,def
3,xyz
(3 rows)
Run Code Online (Sandbox Code Playgroud)

当然,在事实之后过滤掉前两行和底行并不是不可能的,但有没有办法只用psql来做?阅读其手册页,我看到了控制字段分隔符的选项,但没有用于隐藏无关输出.

rua*_*akh 79

您可以使用-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格式; 看它的文件.

  • 或者,如果您想要标题而不是行计数页脚,请使用--pset ="footer = off"运行psql (21认同)
  • `COPY'确实可以是一个有效的替代品,但文件最终会在服务器上,而不是在运行psql的机器上... (3认同)
  • 我认为@GabrielBurt的评论应该是一个独立的答案.这正是我想要生成带有标题的csv但没有讨厌的"`(nnnn行)`"页脚. (3认同)

epi*_*fil 19

您还可以从psql中重定向输出并使用相同的选项.使用\ o设置输出文件,使用\ t仅输出元组(或仅\pset关闭rowcount"footer").

\o /home/flynn/queryout.txt
\t on
SELECT * FROM a_table;
\t off
\o
Run Code Online (Sandbox Code Playgroud)

或者,

\o /home/flynn/queryout.txt
\pset footer off
. . .
Run Code Online (Sandbox Code Playgroud)


Yor*_*iev 9

usually when you want to parse the psql generated output you would want to set the -A and -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"
Run Code Online (Sandbox Code Playgroud)

You could find example of the full bash call here:

  • 干得好,实际回答了问题并赢得了“最佳答案再次位于页面底部”奖。 (3认同)