Sql bind消息提供了3个参数,但准备好了语句&引用;需要0[Node js,pg]
我想像这样将参数传递给我的pg查询:Sql bind消息提供了3个参数,但准备好了语句&引用;需要0[Node js,pg],sql,node.js,postgresql,pg,node-postgres,Sql,Node.js,Postgresql,Pg,Node Postgres,我想像这样将参数传递给我的pg查询: await client.query("DO\n" + "$do$\n" + "DECLARE\n" + " _db TEXT := $1;\n" + " _user TEXT := $2;\n" + " _password TEXT := $3;\n" + "BEGI
await client.query("DO\n" +
"$do$\n" +
"DECLARE\n" +
" _db TEXT := $1;\n" +
" _user TEXT := $2;\n" +
" _password TEXT := $3;\n" +
"BEGIN\n" +
" CREATE EXTENSION IF NOT EXISTS dblink; -- enable extension \n" +
" IF EXISTS (SELECT 1 FROM pg_database WHERE datname = _db) THEN\n" +
" RAISE NOTICE 'Database already exists';\n" +
" ELSE\n" +
" PERFORM dblink_connect('host=localhost user=' || _user || ' password=' || _password || ' dbname=' || current_database());\n" +
" PERFORM dblink_exec('CREATE DATABASE ' || _db);\n" +
" END IF;\n" +
"END\n" +
"$do$", [process.env.database, process.env.user, process.env.password]);
但我得到的bind消息提供了3个参数,但prepared语句“”需要0
。
如果我不传递参数数组,我得到没有参数$1
错误
那么,如何将参数传递给查询?最重要的问题是匿名函数
DO
不接受每个文档的参数。这意味着提供的参数,[process.env.database,process.env.user,process.env.password]
没有地方可去,因为$*占位符被隐藏在函数中。请阅读本文,看看它对参数的说明。感谢您的评论,Adrian。但是说实话,我读了几遍这篇文章,仍然不明白这种行为的原因。Postgre文档感觉很难理解。。。好像是有美元符号的东西。也许我需要更深入地引用DO和dollar。我用字符串插值交换了美元参数并保留了它。问题是DO
不接受参数。$*
隐藏在DO
中,您的[process.env.database,process.env.user,process.env.password]
没有访问权限,因此会显示错误消息。您需要一个合适的函数(db、user、pwd)来传递参数。我不太清楚pg
,但是你能构建db TEXT:=$1\n“
作为db TEXT:=process.env.database;\n”
?哦,我现在明白了,非常感谢您的澄清。在某种程度上,我是在字符串插值的帮助下这样做的:\u db TEXT:='${process.env.database}'
您可以编写一个答案,说明DO
不带参数,我会将其标记为正确。如果我没有提到这一点,我将忽略这一点,这一点对于确保以这种方式传递的值在提交之前应得到正确验证非常重要。