繁体   English   中英

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

[英]how to pass variable to copy command in Postgresql

我试图在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。

看起来psql不支持:variable 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

您可以尝试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

最初询问时可能确实如此,psql 反斜杠命令不支持变量插值,但在我的 PostgreSQL 14 实例中,情况已不再如此。 但是,psql 联机帮助页明确指出 \copy 特别不支持变量插值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM