我想在 shell 中执行一个查询(而不是在交互式的 psql 客户端中),并将它的 CSV 或 TSV 表示打印到 STDOUT。你如何使用 psql
或 PostgreSQL 命令行工具之一来实现这个功能?
我想在 shell 中执行一个查询(而不是在交互式的 psql 客户端中),并将它的 CSV 或 TSV 表示打印到 STDOUT。你如何使用 psql
或 PostgreSQL 命令行工具之一来实现这个功能?
如果您正在使用 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文档。
从Bohemian的答案开始,我发现这些标志很有用:
psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv
编辑后:使用 -F
通过 -F
使用逗号,并使用“未对齐表输出模式” -A
:
psql my_database -U myuser -A -F , -c "select * from mytable"
要指定使用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
'\t'
是不够的;使用--field-separator=$'\t'
可以按预期工作。 - Francesco Frassinelli还有一种可能性是使用拷贝命令,它允许您指定标题、分隔符和引号选项。
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"
您可以使用psql的-F命令行参数指定字段分隔符
包含标题导出为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;
[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]$