我有以下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
,或者通过sed
或perl
或任何类似的unix方法对其进行筛选。