Postgresql 通过命令行将变量传入psql文件。一个变量传递另一个变量

Postgresql 通过命令行将变量传入psql文件。一个变量传递另一个变量,postgresql,psql,Postgresql,Psql,我试图将两个变量传递到一个.psql文件中,该文件是我从命令行通过psql运行的。我的一个变量转换为另一个变量不转换的值。var1(靠近where子句中靠近语句末尾的id值被很好地转换,但是var2作为id的json检查的一部分的变量没有被转换。我假设这与我如何逃避有关,但是在玩了一个小时之后,我被卡住了。谢谢 命令行 psql -h 127.0.0.1 -f "delete.psql" -v var1="$var1" -v var2="$var

我试图将两个变量传递到一个.psql文件中,该文件是我从命令行通过psql运行的。我的一个变量转换为另一个变量不转换的值。var1(靠近where子句中靠近语句末尾的id值被很好地转换,但是var2作为id的json检查的一部分的变量没有被转换。我假设这与我如何逃避有关,但是在玩了一个小时之后,我被卡住了。谢谢

命令行

psql -h 127.0.0.1 -f "delete.psql" -v var1="$var1" -v var2="$var2"
delete.sql

update data
   set value = jsonb_set(value, '{my_items}',
   jsonb_path_query_array(value->'item', '$ ? (@."id" <> (:'var2') )')) where id=(:'var1') ;
更新数据
set value=jsonb_set(值“{my_items}”,
jsonb_路径_查询_数组(值->'item','$?(@。“id”(:'var2'))),其中id=(:'var1');
由于缺少var2的转换而返回的错误

psql:delete.psql:3: ERROR:  syntax error at or near "var2"
LINE 3: ...th_query_array(value->'my_items', '$ ? (@."id" <> (:'var2')...
                                                                ^
psql:delete.psql:3:ERROR:var2处或附近的语法错误
第3行:…th_query_数组(值->'my_items','$?(@.'id'(:'var2'))。。。
^

问题在于变量插值没有在引用的字符串文本中执行。因此这一部分无法工作:

'$ ? (@."id" <> (:'var2') )'
继续传递裸字符串值,并让Postgres动态构造“vars”参数:
jsonb_build_对象('var2',:'var2'))

然后您的
更新
查询可以是:

updatedata set value=jsonb_set(value,{my_items}),jsonb_path_query_数组(value->'item','$?(@。“id”$var2),jsonb_build_对象('var2',:'var2')),其中id=:'var1';
还删除了一些噪声括号

相关的:

您正确引用了变量。请参阅:

有多种替代方法:准备好的语句、(临时)函数……参见:


您是从shell运行psql命令吗?@wildplasser-yes在这种情况下:使用HERE文档。也解决了所有引用问题。我怀疑变量名不应该被引用。必须测试从var1和var2中删除引号吗?因此,只有:var1:var2使用准备好的查询才能解决一些引用问题.