如何将 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