如何从命令行打印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