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