如何将 PostgreSQL 查询输出导出到 csv 文件

Posted

技术标签:

【中文标题】如何将 PostgreSQL 查询输出导出到 csv 文件【英文标题】:How to export a PostgreSQL query output to a csv file 【发布时间】:2015-05-25 06:50:31 【问题描述】:

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

我在 shell 中输入了以下命令:

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

但是当我打开 filename.csv 文件时,所有列的值都被压缩到 Excel csv 中的一列中(见附件截图)。

然后我尝试了另一种方法。我将script.sql 编辑为:

Copy (Select * From ...) To '/tmp/filename.csv' With CSV;

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

\i script.sql

输出是:

COPY 162

嗯,我的输出查询有 162 行。

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

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

【问题讨论】:

当您在 Excel 或其他类似程序中打开文件时,将分隔符更改为 '|' ***.com/questions/8119297/… 在此处查看更全面的答案,它阐明了COPY(服务器端)查询中的\copy(客户端)psql:***.com/questions/1517635/… 【参考方案1】:

现代语法:

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

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

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

默认是文本格式的制表符,CSV格式的逗号

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

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

Export specific rows from a PostgreSQL table as INSERT SQL script PostgreSQL: export resulting data from SQL query to Excel/CSV

【讨论】:

COPY 要求您是超级用户。 \copy 可以被普通用户使用,并且似乎具有相同的语法 这会默认忽略输出中的标题吗? @Spike 是的。如果你想要标题,只需使用 (format CSV, HEADER)【参考方案2】:

大多数之前的答案都是正确的,这里有更多详细信息,仅适用于 linux

1.创建一个类似my_query.sql的文件

\COPY (select * from some_table) TO '/tmp/some_file.csv' (format CSV);

2.更新数据库和文件路径的变量后,运行以下命令。

psql "host=YOUR_HOST port=YOUR_PORT dbname=YOUR_DB user=YOUR_USER password=YOUR_PASS" -af my_query.sql

提示:如果您从 your_table 中选择 *,请注意您的可用磁盘空间,如果有一个大表,您可能会用完空间。

【讨论】:

【参考方案3】:

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

cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz

【讨论】:

【参考方案4】:

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

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

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 批处理命令来处理每一行。如果您真的想要一个 CSV 文件,您需要做的就是:-

ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv

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

【讨论】:

我喜欢psql -c 'select * from table limit 5' -tAF,,它会自动生成csv。 你在哪里使用密码

以上是关于如何将 PostgreSQL 查询输出导出到 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV

如何将表数据从 PostgreSQL (pgAdmin) 导出到 CSV 文件?

sql 将postgreSQL查询的输出重定向到文件

导出 Hive 查询结果

postgresql自动导出SQL语句查出的数据

如何将SQL server 2008 里的查询结果导出到 Excel 表内?