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

问题描述 投票:51回答:6

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

postgresql
6个回答
88
投票

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


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

7
投票

编辑:使用-F

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

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

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
投票

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

3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.