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}"