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

5

我尝试在PostgreSQL SQL语句中定义一个变量,但是没有成功。

有许多CSV文件存储在路径下。我想在PostgreSQL中设置路径,可以告诉复制命令在哪里找到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'license.csv'"。对我来说没有用,因为我有许多csv文件。我也尝试使用"from:outpath ||'licenses.csv'",但它也不起作用。感谢任何帮助。

使用9.3版本。

3个回答

10

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

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

因此,您需要通过类似Unix shell的外部工具来执行此操作。例如:

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

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


感谢您的帮助,Anurag Paul。但是它没有起作用。 - user7070824
COPY 要求角色为超级用户,并且文件和 PostgreSQL 必须在同一台服务器上,因此它有点限制性。 - Anurag Paul

0

当这个问题最初被提出时,psql反斜杠命令可能不支持变量插值,但在我的PostgreSQL 14实例中,这已经不再是问题了。然而,psql手册明确指出\copy不支持变量插值。


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