我有以下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命令的语法。除数据源/目的地以外的所有选项均与COPY中指定的一样。因此,特殊的解析规则适用于\ copy命令。特别是,psql的变量替换规则和反斜杠转义不适用。
我不同意@BaconBits对plpgsqlEXECUTE
可能是答案的问题的评论。与相反,动态或其他方式的服务器端语句将无法访问客户端文件系统\copy
。您可以改用COPY
它,但它必须是超级用户,并且该文件对postgres
服务器上的用户是可访问的。
我相信,\copy
要从变量文件名开始psql
读取变量,必须先将变量注入脚本。您可能会在SQL脚本集成到一个shell脚本和饲料它psql
作为一个可修补此处的字符串,或通过其过滤sed
或perl
或任何类似UNIX的杂交方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句