PostgreSQL:如何从命令行传递参数?
我在脚本中使用了一个稍微详细的查询?
占位符。 我想直接从psql命令行(在脚本之外)testing这个相同的查询。 我想避免进入并取代所有的?
与实际值,而是我想传递查询后的参数。
例:
SELECT * FROM foobar WHERE foo = ? AND bar = ? OR baz = ? ;
寻找像这样的东西:
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
你可以使用-v构造例如
psql -v v1=12 -v v2="'Hello World'"
然后引用sql中的variables为:v1,:v2等
select * from table_1 where id = :v1;
在PostgreSQL中发现,你可以像使用脚本语言一样来执行PREPARE
语句 。 不幸的是,你仍然不能使用?
,但是你可以使用$n
表示法。
使用上面的例子:
-
PREPARE foo(text,text,text) AS SELECT * FROM foobar WHERE foo = $1 AND bar = $2 OR baz = $3 ; EXECUTE foo('foo','bar','baz');
在psql中有一个机制可以通过
\set name val
命令,该命令应该绑定到-v name=val
命令行选项。 引用是痛苦的,在大多数情况下,把整个查询肉放在一个shell里面比较容易。
编辑
哎呀,我应该说-v
而不是-P
(这是格式化选项)以前的答复是正确的。
您也可以在psql命令行或batch file中传入参数。 第一个语句收集连接到数据库的必要细节。
最后的提示要求input约束值,这些值将在WHERE列的IN()子句中使用。 请记住如果string是单引号,并用逗号分隔:
@echo off echo "Test for Passing Params to PGSQL" SET server=localhost SET /P server="Server [%server%]: " SET database=amedatamodel SET /P database="Database [%database%]: " SET port=5432 SET /P port="Port [%port%]: " SET username=postgres SET /P username="Username [%username%]: " SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: " ECHO you typed %constraints% PAUSE REM pause "C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql
现在在您的SQL代码文件中,在您的WHERE子句或SQL中的任何其他地方添加v1标记。 请注意,令牌也可以在打开的SQL语句中使用,而不仅仅在文件中使用。 保存为test.sql:
SELECT * FROM myTable WHERE NOT someColumn IN (:v1);
在Windows中,将整个文件保存为DOS BATCH文件(.bat),将test.sql保存在同一目录中,然后启动batch file。
感谢EnterpriseDB的Dave Page的原始提示脚本。
看来你所要求的不能直接从命令行完成 。 您将不得不在plpgsql中使用用户定义的函数,或者从脚本语言中调用查询(后一种方法使得避免SQL注入更容易一些)。
您可以使用OSvariables首先构造查询string,然后将其传递给PSQL,如下所示:
FOO=FOOVALUE BAR=BARVALUE BAZ=BAZVALUE Q1="select * from foobar where foo=${FOOVALUE} and bar=${BARVALUE} or baz=${BAZVALUE};" PSQL [your connection parameters] -c "${Q1}"