我能否在PostgreSQL的函数中使用\copy命令?

3

我正在尝试将这个语句转换为一个函数:

\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' delimiters ';'; 错误:语法错误或附近的“\”
LINE 1: \copy aux ("nombre") TO '/home/david/lugares.csv' delimiters... ^
查询:\copy aux ("nombre") TO '/home/david/lugares.csv' delimiters ';';
上下文:PL/pgSQL函数crearcsv()第7行执行语句**

这个语句在PSQL控制台上可以正常工作。

有什么帮助吗?


这是因为\copy是一个psql命令,它做的事情与sql命令copy几乎相同,最重要的区别在于\copy使用运行psql的计算机文件系统上的文件,而copy使用服务器文件系统上的文件。因此,它们非常相似但不完全相同,并且您不能在函数中使用\copy,因为它不是一个SQL命令。 - fvu
2
\copypsql 命令,只能psql 中执行。它不是通用的 SQL 语句。 - user330315
那么,我该如何实现这个功能? - user3733164
1
@user3733164,您无法这样做。通过pl/pgsql函数无法在客户端上读取或写入文件。 - Craig Ringer
2个回答

1
您可以直接在 copy 中更改 \copyCOPY 是“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 的服务器上。如果你在本地主机上运行 postgres 服务器,则这将是相同的,但在更复杂的情况下可能会成为一个大问题。
参见文档:http://www.postgresql.org/docs/9.3/static/sql-copy.html 以及这个答案:将 PL/pgSQL 输出保存到 CSV 文件中

1
这样做的缺点是,在Postgres中,只有超级用户才能使用copy,因为它会在服务器上写入文件。 - user330315
正如 a_horse_with_no_name 所说,我无法使用 COPY,因为它需要由超级用户使用。很抱歉我没有提到这点。 - user3733164
文件系统IO操作通常不是通过数据库函数来完成的(但并非不可能:这取决于您的情况)。您可以尝试使用plpython或plperl,但可能会遇到与plpgsql类似的问题。建议使用执行psql的shell脚本来尝试解决。 - Tom-db

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接