【问题标题】:Can I use \copy command into a function of postgresql?我可以在 postgresql 的函数中使用 \copy 命令吗?
【发布时间】:2015-08-24 17:55:50
【问题描述】:

我正在尝试将此语句创建为函数:

\copy aux("nombre") TO '/home/david/lugares.csv' delimiters ';';

所以我做下一个:

 CREATE OR REPLACE FUNCTION crearcsv()
      RETURNS void AS
    $BODY$
    DECLARE STATEMENT TEXT; 
    BEGIN
        RAISE NOTICE 'CREAR CSV';
        STATEMENT:= '\copy aux ("nombre") TO ''/home/david/lugares.csv'' delimiters '';'';';    
        RAISE NOTICE '%',STATEMENT;
        EXECUTE STATEMENT;
    END;$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;

但是当我调用该函数时,我得到了下一个:

注意:\copy aux ("nombre") TO '/home/david/lugares.csv' 分隔符 ';'; 错误:“\”处或附近的语法错误
第 1 行:\copy aux ("nombre") TO '/home/david/lugares.csv' 分隔符... ^
查询:\copy aux ("nombre") TO '/home/david/lugares.csv' 分隔符 ';';
上下文:PL/pgSQL 函数 crearcsv() 第 7 行 EXECUTE 语句**

此语句在 PSQL 控制台中运行良好

有什么帮助吗?

【问题讨论】:

  • 那是因为\copy 是一个psql command,它或多或少地做了sql command copy does 的作用——最重要的区别是\copy 使用运行psql 的计算机的文件系统上的文件,并且copy 使用服务器文件系统上的文件。因此,它们高度相似但不完全相同,您不能在函数中使用 \copy,因为它不是 sql 命令。
  • \copy 是一个psql 命令,只能psql 中执行。它不是一般的 SQL 语句。
  • 那么,我该怎么做这个功能呢?
  • @user3733164 你不能。无法通过 pl/pgsql 函数在客户端读取或写入文件

标签: postgresql export-to-csv


【解决方案1】:

您可以简单地将\copy 更改为copyCOPY\copy 的“sql 变体”,在数据库函数中工作,语法相同,但有一些与您相关的差异:

COPY 是 Postgres 的数据加载方法。 Postgres 的 COPY 进来了 两个独立的变体,COPY 和 \COPY:COPY 是基于服务器的,\COPY 是 基于客户端。

COPY 将由 PostgreSQL 后端(用户“postgres”)运行。这 后端用户需要读取和写入数据文件的权限 命令从/复制到它。您需要使用绝对路径名 复制。 \COPY 另一方面,在当前 $USER 下运行,并使用 那个用户环境。 \COPY 可以处理相对路径名。这 psql \COPY 如果它处理你的内容,因此更容易使用 需要。

使用其中任何一个,您还需要插入/更新或选择 表上的权限,以便复制到它或从它复制。

来自https://wiki.postgresql.org/wiki/COPY

主要区别在于COPY会将输出文件写入运行postgres服务器的文件系统,而不是执行COPY的服务器。如果您在 localhost 上运行 postgres 服务器,这将是相同的,但在更复杂的情况下可能会成为大问题。

另请参阅文档:http://www.postgresql.org/docs/9.3/static/sql-copy.html

这个答案:Save PL/pgSQL output from PostgreSQL to a CSV file

【讨论】:

  • 这样做的缺点是copy 只能由 Postgres 中的超级用户使用,因为它会在服务器上写入文件。
  • 正如 a_horse_with_no_name 所说,我不能使用 COPY,因为它需要由超级用户使用。对不起,因为我没有提到它
  • 文件系统 IO 操作通常不适合通过数据库函数进行(但并非不可能:具体取决于您的场景)。您可以尝试使用 plpython 或 plperl,但您可能会遇到与使用 plpgsql 类似的问题。尝试使用执行 psql 的 shell 脚本。
【解决方案2】:

您最好编写一个连接到数据库并运行 COPY 命令的 Python 脚本。 Psycopg2 是最好的适配器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多