我有以下 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 中所述manpage:
该命令的语法与 SQL COPY 命令类似。
除数据源/目标之外的所有选项均按指定
用于复制。因此,特殊的解析规则适用于 \copy
命令。特别是 psql 的变量替换规则和
反斜杠转义不适用.
我不同意 @BaconBits 对 plpgsql 问题的评论EXECUTE
可能就是答案。服务器端语句,无论是动态的还是其他方式,都不会访问客户端文件系统,这与\copy
。您可以使用COPY
相反,但它需要超级用户并且该文件可以被postgres
服务器上的用户。
我相信,为了\copy
从变量文件名,变量必须先注入到脚本中psql
读它。您可以将 SQL 脚本集成到 shell 脚本中并将其提供给psql
作为可修补的此处字符串,或通过过滤它sed
or perl
或任何类似的 Unix 风格的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)