如何从命令行以CSV或TSV格式打印PostgreSQL查询结果?

66

我想在 shell 中执行一个查询(而不是在交互式的 psql 客户端中),并将它的 CSV 或 TSV 表示打印到 STDOUT。你如何使用 psql 或 PostgreSQL 命令行工具之一来实现这个功能?

8个回答

114

如果您正在使用 PostgreSQL 8.2 或更新版本,请使用以下内容来处理 CSV 格式:

psql -c "COPY (<select query>) TO STDOUT WITH CSV"

并且对于TSV格式,使用适当的NULL值:

psql -c "COPY (<select query>) TO STDOUT WITH NULL AS ''"

CSV格式会正确引用包含双引号字符的字段。有关更多详细信息和COPY选项,请参阅您特定版本的PostgreSQL文档。


13
这真的让这些事情变得容易,不是吗?想象一下某些 “大型数据库供应商” 的答案...首先安装这个 64 兆大小的软件包,然后运行这个具有最独特语法的导出工具。在使用过程中要小心,不要意外删除整个数据库。 :) - Scott Marlowe
注意:您无法通过此方式获取TSV的标题,您需要类似于https://dev59.com/UDsDtIcB2Jgan1znU3bf#57862424的东西。 - dfrankow

42

从Bohemian的答案开始,我发现这些标志很有用:

psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv
  • 不对齐的输出模式:-A
  • 使用逗号作为字段分隔符:-F ,
  • 不读取psqlrc:-X
  • 仅元组(无页眉/页脚):-t
  • 包含SQL查询的文件:-f
  • 输出文件:-o

6
如果你输出了一个带逗号的文本字段,那么这个操作可能会出现意料之外的结果。 - Jon Carlson

8

编辑后:使用 -F

通过 -F 使用逗号,并使用“未对齐表输出模式” -A

psql my_database -U myuser -A -F , -c "select * from mytable"

3
如果分隔符出现在列的值中,这将会导致问题。 - Red15
@Red15,你如何解决这个问题,“如果分隔符出现在列值中”? - Jin.X
@Jin 你应该提出一个新问题 - Bohemian
@Jin.X 我个人认为CSV输出(即被接受的答案)是最简单的方法。 - Red15

8

最简单的方法(使用psql)似乎是使用--csv标志:

psql --csv -c "SELECT * FROM sometable"

6

要指定使用tsv,请使用分隔符'\t'

psql my_database -U myuser -F'\t' --no-align -f mysqlfile.sql -o outputfile.tsv

为了指定csv格式,使用逗号','作为分隔符。

psql my_database -U myuser -F',' --no-align -f mysqlfile.sql -o outputfile.csv

在Bash中,'\t'是不够的;使用--field-separator=$'\t'可以按预期工作。 - Francesco Frassinelli

4

还有一种可能性是使用拷贝命令,它允许您指定标题、分隔符和引号选项。

psql my_database -U my_user -c "copy (select a.id,b.id from my_table_a as a inner join my_table_b as b on b.id = a.id) to STDOUT"

3

您可以使用psql的-F命令行参数指定字段分隔符


2

包含标题导出为TSV格式

您可以按以下方式包含标题:

\COPY (SELECT * FROM tca) TO '/.../metab/tca.tsv' WITH DELIMITER E'\t' CSV HEADER;

\COPY (SELECT * FROM tca) TO '/...a/metab/tca.tsv' WITH NULL AS '' DELIMITER E'\t' CSV HEADER;

最初的回答:
例如(PSQL):
[metabolism]# \COPY (SELECT * FROM tca) TO '/mnt/Vancouver/programming/data/metabolism/tca.tsv' WITH NULL AS '' DELIMITER E'\t' CSV HEADER;
COPY 22

BASH:

[victoria@victoria tsv]$ pwd
/mnt/Vancouver/programming/data/metabolism/tsv

[victoria@victoria tsv]$ head -n3 tca.tsv
uuid    src tgt rel rel_type
878b87de-0ca8-49a8-9f77-a24353e251d2    oxalosuccinic acid  oxoglutaric acid    1.1.1.42    2
7fd9cf88-495b-491b-956e-294f19097923    isocitric acid  oxoglutaric acid    1.1.1.41    2
[victoria@victoria csv]$ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接