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

时间:2012-03-29 22:05:54

标签: sql postgresql

如何隐藏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来做?阅读其手册页,我看到了控制字段分隔符的选项,但没有隐藏无关输出的内容。

3 个答案:

答案 0 :(得分:65)

您可以使用-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

答案 1 :(得分:17)

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

\o /home/flynn/queryout.txt
\t on
SELECT * FROM a_table;
\t off
\o

可替换地,

\o /home/flynn/queryout.txt
\pset footer off
. . .

答案 2 :(得分:1)

通常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的示例: