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 another

mysql 的类似解决方案:

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)

在 postgresql 中输出多个 sql 查询的结果

将 PostgreSql 时间戳查询转换为 MS SQL/Azure SQL

sql查询结果部分替换