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

Posted

技术标签:

【中文标题】如何在 Psql 输出中隐藏结果集修饰【英文标题】:How to hide result set decoration in Psql output 【发布时间】:2012-03-29 22:05:53 【问题描述】:

如何在 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呢?阅读它的联机帮助页,我看到了用于控制字段分隔符的选项,但没有看到用于隐藏无关输出的选项。

【问题讨论】:

psql -U username -X -A -w -t -c "select count(*) from yourtable)" 只产生输出:1 【参考方案1】:

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

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

编辑(一年多后)添加:

您可能还想查看the COPY command。我不再有任何 PostgreSQL 实例可以方便地进行测试,但我认为您可以按照以下方式编写一些内容:

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

(除了result.txt 需要是绝对路径)。 COPY 命令还支持更智能的 CSV 格式;见its documentation。

【讨论】:

或者,如果您想要页眉而不是行数页脚,请使用 --pset="footer=off" 运行 psql COPY 确实是一个有效的替代方案,但文件最终会在服务器上,而不是在运行 psql 的机器上... @fvu:好点。我通常在服务器上运行psql ,所以对我来说这不是问题。 . . 我认为@GabrielBurt 评论应该是一个独立的答案。这正是我想要生成带有标题但没有讨厌的“(nnnn rows)”页脚的csv。 @Merlin:不,他的评论不是对 OP 问题的正确答案。很多人发现它很有用,这很好,但我们不要假装它不是。【参考方案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】:

通常when you want to parse the psql generated output 你会想要设置-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 调用示例 here:

【讨论】:

以上是关于如何在 Psql 输出中隐藏结果集修饰的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在不使用 `psql` 的命令或选项的情况下显示集群中的所有数据库? [复制]

psql 的替代输出格式

jquery如何在结果集循环添加tr,td标签。

如何在python中读取隐藏的输出细节? [复制]

plpgsql 专家:(记录集)函数的输入和输出

如何在 Oracle 中合并结果集?