【问题标题】:How to hide result set decoration in Psql output如何在 Psql 输出中隐藏结果集修饰
【发布时间】: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

标签: sql postgresql


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多