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

时间:2011-06-29 13:37:44

标签: postgresql

我想从shell(不在交互式psql客户端)中执行查询,并将输出的CSV或TSV表示打印到STDOUT。如何使用psql或其中一个PostgreSQL命令行工具?

8 个答案:

答案 0 :(得分:89)

如果您使用的是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文档。

答案 1 :(得分:36)

从波希米亚的回答开始,我发现这些标志很有用:

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

答案 2 :(得分:7)

编辑:使用-F

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

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

答案 3 :(得分:5)

要指定 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

答案 4 :(得分:4)

也可以使用copy命令来指定标题,分隔符和引用选项

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"

答案 5 :(得分:3)

您可以使用ps_

的-F命令行参数指定字段分隔符

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

导出为带有标题的TSV

您可以按以下方式包含HEADER:

\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

重击:

[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]$