如何在 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" 运行 psqlCOPY
确实是一个有效的替代方案,但文件最终会在服务器上,而不是在运行 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 输出中隐藏结果集修饰的主要内容,如果未能解决你的问题,请参考以下文章