【问题标题】:PostgreSQL: export resulting data from SQL query to Excel/CSVPostgreSQL:将结果数据从 SQL 查询导出到 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 中使用。

标签: postgresql file-io postgresql-copy


【解决方案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 以进行小型查询。

密切相关的答案:

MySQL 的类似解决方案:

【讨论】:

  • 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;
    

    注意:文件夹必须是可写的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多