关于shell:如何将PostgreSQL查询输出导出到csv文件

How to export a PostgreSQL query output to a csv file

我在将PostgreSQL输出从shell导出到csv文件时遇到问题。
我的SQL脚本名为script.sql

我在shell中输入以下命令:

1
psql congress -af script.sql &> filename.csv

但是当我打开filename.csv文件时,Excel csv中的所有列的值都会被挤压到一列中(请参阅附带的屏幕截图)。

然后我尝试了另一种方式。 我编辑了我的script.sql

1
Copy (SELECT * FROM ...) TO '/tmp/filename.csv' WITH CSV;

然后我在数据库dbname中的shell中键入以下命令。

1
\i script.sql

输出是:

1
COPY 162

好吧,我的输出查询有162行。

所以我的输出表的162行已经复制到shell中。 如何将它们粘贴或移动到csv文件?

或者,如果我要使用filename.csv(附带截图),我该如何修复该csv / Excel文件的格式?

Screenshot of filename.csv


现代语法:

1
COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (format CSV);

So the 162 rows of my output table have been copied in the shell. How
can I paste or move them to a csv file?

结果是CSV文件。使用匹配的分隔符,使用任何电子表格程序打开它。每个文件:

The default is a tab character in text format, a comma in CSV format

与Patrick评论一样,您可以以类似的方式使用相应的psql元命令\copy。它写入(并读取)客户端本地文件,不需要超级用户权限。

在这些相关答案中有更多解释:

  • 将PostgreSQL表中的特定行导出为INSERT SQL脚本
  • PostgreSQL:将结果数据从SQL查询导出到Excel / CSV


在一点切线上,还有另一种方法。

我在Windows批处理脚本中使用以下内容: -

1
psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o"%dumpDir%\tables.txt" -A -c"SELECT table_schema, table_name   FROM information_schema.tables WHERE table_schema = '%qSchema%';"

诀窍是记住-A选项。它抑制了数据的空白填充。

我这样做是为了避免上面显示的COPY命令的权限错误,因为运行postgress的帐户与运行我的预定批处理文件的帐户没有相同的权限。

这给我一个给定模式中的表列表,结果如下: -

MYSCHEMA | MYTABLE1

MYSCHEMA | mytable2

然后,我使用FOR batch命令处理每一行。如果您真的想要一个CSV文件,那么您需要做的就是:

1
2
ECHO table_schema,TABLE_NAME > %dumpDir%\TABLES.csv
FOR /F"delims=|" %%p IN (%dumpDir%\TABLES.txt) DO echo %%p,%%q >> %dumpDir%\TABLES.csv

可能不是最有效的机制,但在少量输出行上工作正常。


首先将您的连接信息复制到?/ .pgpass和

1
2
3
cat ip:port:dbname:USER:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > RESULT.txt.gz