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

时间:2015-03-23 20:00:21

标签: sql database postgresql

我有以下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”的文件。我做错了吗?

1 个答案:

答案 0 :(得分:2)

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

  

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

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

我相信从变量文件名到\copy,必须在psql读取之前将变量注入脚本。您可以将SQL脚本集成到shell脚本中,并将其作为可修改的here-string提供给psql,或者通过sedperl或任何类似的unix-ish方法对其进行过滤。 / p>