如何在Postgresql中将变量传递给copy命令

时间:2017-07-27 16:56:12

标签: postgresql psql

我试图在Postgresql的SQL语句中创建一个变量,但它没有用。 路径下存储了许多csv文件。我想在Postgresql中设置路径,可以告诉copy命令在哪里可以找到csv文件。

SQL语句示例:

\set outpath '/home/clients/ats-dev/'
\COPY licenses (_id, name,number_seats ) FROM :outpath + 'licenses.csv' CSV HEADER DELIMITER ',';
\COPY uploaded_files (_id, added_date ) FROM :outpath + 'files.csv' CSV HEADER DELIMITER ',';

它不起作用。我收到错误:没有这样的文件。 licneses.csv和files.csv这两个文件存储在Ubuntu上的/ home / cilents / ats-dev下。我发现了一些使用“\ set file'licence.csv'”的问题。它对我不起作用因为我有很多csv文件。我也尝试使用“from:outpath ||'profile.csv'”。它没有工作以太。感谢任何帮助。

使用9.3。

2 个答案:

答案 0 :(得分:6)

看起来psql不支持:variable反斜杠命令中的psql替换。

test=> \set somevar fred
test=> \copy z from :somevar
:somevar: No such file or directory

因此您需要通过外部工具(如unix shell)执行此操作。 e.g。

for f in *.sql; do
    psql -c "\\copy $(basename $f) FROM '$f'"
done

答案 1 :(得分:4)

您可以尝试 COPY 命令

\set outpath '\'/home/clients/ats-dev/'
COPY licenses (_id, name,number_seats ) FROM :outpath/licenses.csv' WITH CSV HEADER DELIMITER ',';
COPY uploaded_files (_id, added_date ) FROM :outpath/files.csv' WITH CSV HEADER DELIMITER ',';

注意:COPY命令中指定的文件由服务器直接读取或写入,而不是由客户端应用程序读取或写入。因此,它们必须驻留在数据库服务器计算机上,或者可以访问它们,而不是客户端。它们必须是PostgreSQL用户(服务器运行的用户ID)可访问,可读或可写,而不是客户端。类似地,用PROGRAM指定的命令由服务器直接执行,而不是由客户端应用程序执行,必须由PostgreSQL用户执行。 COPY命名文件或命令只允许用于数据库超级用户,因为它允许读取或写入服务器有权访问的任何文件。

文档:Postgresql 9.3 COPY