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

我希望从shell执行查询(不在交互式psql客户端中),并将输出的CSV或TSV表示forms打印到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文档。

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

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

编辑:使用-F

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

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

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

复制命令也可以让你指定标题,分隔符和引用选项

 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" 

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