PostgreSQL:如何从命令行传递参数?

vol*_*ron 79 postgresql parameters

我在使用?占位符的脚本中有一个详细的查询.我想直接从psql命令行(脚本外部)测试这个相同的查询.我想避免进入并用?实际值替换所有值,而是想在查询后传递参数.

例:

SELECT  * 
FROM    foobar
WHERE   foo = ?
   AND  bar = ?
    OR  baz = ?  ;
Run Code Online (Sandbox Code Playgroud)

寻找类似的东西:

%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
Run Code Online (Sandbox Code Playgroud)

Gav*_*vin 160

你可以使用-v构造例如

psql -v v1=12  -v v2="'Hello World'" -v v3="'2010-11-12'"
Run Code Online (Sandbox Code Playgroud)

然后将sql中的变量称为:v1,:v2等

select * from table_1 where id = :v1;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在阅读本文后,我希望发现使用 -v 设置的变量可用于使用 -c 执行的命令,但是,可惜它们不是。换句话说, `psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" -c 'select * from table_1 where id = :v1;'` 将产生语法错误。但是,如果您的 shell 是 bash,您可以尝试: `psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" <<< 'select * from table_1其中 id = :v1;'` 效果良好。 (9认同)
  • 当然,只需使用`\ set v3'另一个值'.请记住,当你需要引用SQL语句中的值时,在变量名周围使用撇号,如下所示:`SELECT*FROM foo WHERE bar =:'v3';` (8认同)
  • +1有趣,传递命名参数。登录后,您知道执行此操作的任何方式吗? (2认同)
  • 我猜他们是从 `awk` 那里得到的 (2认同)

vol*_*ron 27

在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');
DEALLOCATE foo;
Run Code Online (Sandbox Code Playgroud)

  • `DEALLOCATE foo;` (5认同)

wil*_*ser 11

在psql中有一个通过的机制

\set name val
Run Code Online (Sandbox Code Playgroud)

命令,应该与-v name=val命令行选项绑定.引用很痛苦.在大多数情况下,将整个查询内容放在shell文件中更容易.

编辑

哎呀,我应该说-v而不是-P(这是格式化选项)以前的回复是正确的.


MAb*_*am1 6

您还可以在psql命令行或批处理文件中传递参数.第一个语句收集连接到数据库的必要详细信息.

最后的提示要求输入约束值,这些值将在WHERE列IN()子句中使用.请记住单引号if字符串,并用逗号分隔:

@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
Run Code Online (Sandbox Code Playgroud)

现在,在您的SQL代码文件中,在WHERE子句中或SQL中的任何其他位置添加v1标记.请注意,标记也可以在打开的SQL语句中使用,而不仅仅在文件中使用.将其保存为test.sql:

SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);
Run Code Online (Sandbox Code Playgroud)

在Windows中,将整个文件保存为DOS BATch文件(.bat),将test.sql保存在同一目录中,然后启动批处理文件.

感谢EnterpriseDB的Dave Page,提供原始提示脚本.

  • 您必须在示例的第 15 行中将“SET /P Bunos=...”更改为“SET /P约束=...”,然后它才能工作。 (2认同)