PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV
Posted
技术标签:
【中文标题】PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV【英文标题】:PostgreSQL: export resulting data from SQL query to Excel/CSV 【发布时间】:2011-12-28 11:47:03 【问题描述】:我需要将 PostgreSQL 中查询的结果数据导出到 Excel/CSV。
我用PostgreSQL 8.2.11
。
SQL error:
ERROR: relative path not allowed for COPY to file
In statement:
COPY (select distinct(m_price) from m_product)TO '"c:\auto_new.txt"';
【问题讨论】:
名称为PostgreSQL
或简称Postgres
。没有Postgre
。
如果文件名包含空格或特殊字符,您只需要双引号。 'C:\\auto_new.txt'
不需要。 (虽然没有错。)。有
我尝试给 >TO 'C:\\auto_new.txt' 但同样的错误
TO
前面也少了一个空格。不确定 PostgreSQL 8.2 是否关心。它仍然可以在 9.0 中使用。
【参考方案1】:
Unix 风格文件名示例:
COPY (SELECT * FROM tbl) TO '/var/lib/postgres/myfile1.csv' format csv;
阅读manual about COPY
(链接到版本 8.2)。
您必须为目标文件使用绝对路径。确保用空格将文件名双引号。 MS Windows 示例:
COPY (SELECT * FROM tbl)
TO E'"C:\\Documents and Settings\\Tech\Desktop\\myfile1.csv"' format csv;
在 PostgreSQL 8.2 中,默认情况下使用 standard_conforming_strings = off
,您需要使用双反斜杠,因为 \
是一个特殊字符,由 PostgreSQL 解释。适用于任何版本。都是in the fine manual:
文件名
输入或输出文件的绝对路径名。 Windows 用户可能需要使用
E''
字符串和用作路径分隔符的双反斜杠。
或者standard_conforming_strings = on
的现代语法(自 Postgres 9.1 起默认):
COPY tbl -- short for (SELECT * FROM tbl)
TO '"C:\Documents and Settings\Tech\Desktop\myfile1.csv"' (format csv);
或者您可以also use forward slashes 获取 Windows 下的文件名。
另一种方法是使用meta-command \copy
of the default terminal client psql
。
您还可以使用pgadmin 之类的 GUI 并将结果网格中的复制/粘贴到 Excel 以进行小型查询。
密切相关的答案:
Copy results from a PostgreSQL view in one DB to a table in anothermysql 的类似解决方案:
Exporting MYSQL data into Excel/CSV via php【讨论】:
COPY (SELECT * FROM tbl) TO 'C:/Documents and Settings/Tech/Desktop/myfile1.csv'; SQL 错误:错误:不允许 COPY 到文件的相对路径 @soul:我怀疑你的文件名中有空格。请参阅我修改后的答案。 @soul: 啊.. Windows 需要反斜杠。请参阅修改后的答案。 (我使用 Debian。) @sanre6:永远记住COPY
处理服务器本地的文件。如果您的客户端在另一台机器上,请使用 psql 客户端的元命令 \copy
或其他一些工具,例如 pgAdmin。
@AKIWEB:点击我上面的链接并阅读手册。如果仍有不清楚的地方,请提出问题。评论不是地方。【参考方案2】:
Squirrel、SQL Workbench/J、AnySQL、ExecuteQuery 等几个 GUI 工具可以导出到 Excel 文件。
大部分工具都列在 PostgreSQL wiki 中:
http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools
【讨论】:
【参考方案3】:这对我有用:
COPY (SELECT * FROM table)
TO E'C:\\Program Files (x86)\\PostgreSQL\\8.4\\data\\try.csv';
在我的情况下,问题在于特殊文件夹的写入权限(尽管我以管理员身份工作),在更改 PostgreSQL 下原始数据文件夹的路径后,我成功了。
【讨论】:
什么版本的PostgreSQL?【参考方案4】:postgres (Ubuntu) 的正确脚本是:
COPY (SELECT * FROM tbl) TO '/var/lib/postgres/myfile1.csv';
【讨论】:
psql -c "COPY (SELECT * FROM tbl) TO '/var/lib/postgres/myfile1.csv';"如果需要,不要忘记添加数据库、用户和密码。 -c 标志为您提供从 ubuntu(linux) 终端运行命令的选项。 我想在我的字符串值周围加上引号。我怎样才能? @迈克尔 你可以试试 ' ' 或 "\""【参考方案5】:如果您遇到“错误:无法打开服务器文件“/文件”:权限被拒绝”之类的错误,您可以修复它:
遇到了同样的问题,这是我找到的解决方案: 在 /home 下创建一个新文件夹(例如 tmp) $ cd /主页 使 postgres 成为该文件夹的所有者 $ chown -R postgres:postgres tmp 将要写入数据库的文件复制到 tmp 中,并确保它们也属于 postgres。 而已。在那之后你应该做生意了。
【讨论】:
或者你可以复制到/tmp。为我工作。【参考方案6】:在 PostgreSQL 9.4 中创建带有 Ubuntu 中标头的 CSV 文件:
COPY (SELECT * FROM tbl) TO '/home/user/Desktop/result_sql.csv' WITH CSV HEADER;
注意:文件夹必须是可写的。
【讨论】:
以上是关于PostgreSQL:将结果数据从 SQL 查询导出到 Excel/CSV的主要内容,如果未能解决你的问题,请参考以下文章
如何为复杂的 sql 查询获取中间数据。 PostgreSQL
按百分位数将类似 sql 的查询的结果分组:在 Redshift / postgresql
将一个表的查询结果插入到另一个表中(oracle、mysql、sql 、GP)