为什么我不能在 postgres 反斜杠命令中使用变量 (\COPY)



我有以下sql脚本:

COPY my_table (column_1, column_2) FROM :csv_file WITH (FORMAT CSV, DELIMITER ',', ESCAPE '"');

我打电话的地址:

psql -d $DB_NAME -f $SQL_FILE -v csv_file="$CSV_FILE"

但它一直在寻找一个名为":csv_file"的文件。我做错什么了吗?

通常,变量替换确实适用于元命令(以反斜杠开头),但copy是一个例外,如psql的手册页:中所述

此命令的语法与SQL COPY命令的语法类似。除数据源/目标之外的所有选项都是指定的用于复印。因此,特殊的解析规则适用于\副本命令特别是psql的变量替换规则和反斜杠转义不适用

我不同意@BaconBits对plpgsql的EXECUTE可能是答案的评论。与copy相反,服务器端语句(无论是动态语句还是其他语句)都不会访问客户端文件系统。您可以使用COPY,但它需要是超级用户,并且服务器上的postgres用户可以访问该文件。

我认为,对于来自变量文件名的copy,在psql读取之前,必须将变量注入脚本中。您可以将SQL脚本集成到shell脚本中,并将其作为可修补的here字符串提供给psql,或者通过sedperl或任何类似的unix方法对其进行筛选。

最新更新