Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql bind消息提供了3个参数,但准备好了语句&引用;需要0[Node js,pg]_Sql_Node.js_Postgresql_Pg_Node Postgres - Fatal编程技术网

Sql bind消息提供了3个参数,但准备好了语句&引用;需要0[Node js,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

我想像这样将参数传递给我的pg查询:

    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
不带参数,我会将其标记为正确。如果我没有提到这一点,我将忽略这一点,这一点对于确保以这种方式传递的值在提交之前应得到正确验证非常重要。