我有以下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”的文件。我做错了吗?
答案 0 :(得分:2)
通常,变量替换适用于元命令(以反斜杠开头),但\copy
是一个例外,如psql manpage中所述:
此命令的语法类似于SQL COPY命令的语法。 除数据源/目标之外的所有选项都是指定的 对于COPY。因此,特殊的解析规则适用于\ copy 命令。 特别是psql的变量替换规则和 反斜杠转义不适用。
我不同意@BaconBits对plpgsql的EXECUTE
可能是答案的问题的评论。与\copy
相反,服务器端语句(动态或其他)不会访问客户端文件系统。您可以改为使用COPY
,但它需要是超级用户,并且该文件可供服务器上的postgres
用户访问。
我相信从变量文件名到\copy
,必须在psql
读取之前将变量注入脚本。您可以将SQL脚本集成到shell脚本中,并将其作为可修改的here-string提供给psql
,或者通过sed
或perl
或任何类似的unix-ish方法对其进行过滤。 / p>