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

dan*_*dan 59 postgresql

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

Mat*_*ood 95

如果您使用的是PostgreSQL 8.2或更高版本,请将其用于CSV:

psql -c "COPY (<select query>) TO STDOUT WITH CSV"
Run Code Online (Sandbox Code Playgroud)

这个TSV,有正确的NULL:

psql -c "COPY (<select query>) TO STDOUT WITH NULL AS ''"
Run Code Online (Sandbox Code Playgroud)

CSV表单将正确引用包含双引号字符的任何字段.有关COPY的更多详细信息和选项,请参阅特定版本的PostgreSQL文档.

  • 它确实让这个东西变得容易,不是吗?想象一下"大数据库供应商"的答案......首先安装这个64 Meg软件包,然后运行这个具有可以想象的最神秘语法的导出工具.使用它时请注意不要删除整个数据库.:) (9认同)
  • 我喜欢Postgres! (8认同)

Jas*_*tta 38

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

psql my_database -U myuser -A -F , -X -t -f /path/to/query.sql -o /path/to/output.csv
Run Code Online (Sandbox Code Playgroud)
  • 未对齐输出模式:-A
  • 使用逗号作为字段分隔符:-F,
  • 不要读psqlrc:-X
  • 仅元组(无页眉/页脚): - t
  • 包含SQL查询的文件:-f
  • 输出文件:-o

  • 如果输出带有逗号的文本字段,这将*不会像您预期的那样工作. (4认同)

Yan*_*oto 9

最简单的方法(使用psql)似乎是使用--csv标志:

psql --csv -c "SELECT * FROM sometable"
Run Code Online (Sandbox Code Playgroud)


Boh*_*ian 7

编辑:使用-F

使用逗号via -F并使用"unaligned table output mode" -A:

psql my_database -U myuser -A -F , -c "select * from mytable"
Run Code Online (Sandbox Code Playgroud)

  • 如果您的分隔符出现在列的值中,则会出现问题. (2认同)

小智 5

要指定tsv,请使用定界符'\ t'

psql my_database -U myuser -F'\t' --no-align -f mysqlfile.sql -o outputfile.tsv
Run Code Online (Sandbox Code Playgroud)

要指定csv,请使用定界符','

psql my_database -U myuser -F',' --no-align -f mysqlfile.sql -o outputfile.csv
Run Code Online (Sandbox Code Playgroud)