如何在psql脚本中使用变量

4

这是我的psql脚本,但它无法正常工作:

\set path '''c:\\server\\data\\''';
COPY paymentMethods (name,regexString) FROM :path+'paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :path+'priceLevels.csv' WITH (FORMAT csv, HEADER false);

psql 抱怨在 + 处有语法错误。

我该如何更改它以使其工作,同时只提及实际路径字符串一次?

2个回答

13
首先,您正在尝试使用+运算符连接两个字符串,但SQL连接运算符是 ||,有了这个信息,您可能会认为期望的结果是(不能工作):
\set path '''c:\\server\\data\\'''
COPY paymentMethods (name,regexString) FROM :path || 'paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :path || 'priceLevels.csv' WITH (FORMAT csv, HEADER false);

但是!COPY命令需要一个字符串字面量作为路径,而不是表达式,因此您应该给出路径。请注意,对于类似于SELECTINSERTUPDATE等命令,这将起作用。

有了这些信息,您只能使用psql变量,并将字符串连接到psql的变量中。一个好的解决方案是使用psql:'var'语法,它将变量作为字符串插入到SQL表达式中:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM :'paymentMethodsPath' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :'priceLevels' WITH (FORMAT csv, HEADER false);

这将生成(发送到PostgreSQL服务器):
COPY paymentMethods (name,regexString) FROM E'c:\\server\\data\\paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM E'c:\\server\\data\\priceLevels.csv' WITH (FORMAT csv, HEADER false);

这个:'var'语法在某些psql版本上无法工作(我现在不记得是哪一个版本引入的),但对于旧版本,您可以轻松使用美元引用:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM $$:paymentMethodsPath$$ WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM $$:priceLevels$$ WITH (FORMAT csv, HEADER false);

或者使用单引号进行转义:

\set path 'c:\\server\\data\\'
\set paymentMethodsPath 'E''':path'paymentMethods.csv'''
\set priceLevelsPath 'E''':path'priceLevels.csv'''
COPY paymentMethods (name,regexString) FROM :paymentMethodsPath WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :priceLevels WITH (FORMAT csv, HEADER false);

就是这样。


4

psql没有运算符。您只能将变量(某处)放在其中

postgres=# \set var1 AAAA
postgres=# \set var2 BBBB
postgres=# \echo :var1:var2
AAAABBBB
postgres=# \echo :var1 :var2
AAAA BBBB
postgres-# \echo :var1'\\':var2
AAAA\BBBB

postgres=# \set mypath '/tmp'
postgres=# \set mypathx :mypath/x.csv
postgres=# \echo :mypathx
/tmp/x.csv
postgres=# copy fo from :'mypathx';
COPY 1
postgres=# \set mypathy :mypath/y.csv
postgres=# copy fo from :'mypathy';
COPY 1

那么,你的答案是在psql脚本中实现我想要的东西是不可能的吗? - mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接