【问题标题】:bind message supplies 3 parameters, but prepared statement "" requires 0 [Node js, pg]绑定消息提供 3 个参数,但准备好的语句“”需要 0 [Node js, pg]
【发布时间】:2020-10-18 15:42:13
【问题描述】:

我想像这样将参数传递给我的 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 message supplies 3 parameters, but prepared statement "" requires 0。 如果我不传递参数数组,我会得到there is no parameter $1 错误。

那么如何将参数传递给我的查询?

【问题讨论】:

  • 阅读此DO 并查看它对参数的说明。
  • 感谢您的评论,阿德里安。但老实说,我读了几次这个页面,仍然不明白这种行为的原因。 Postgre 文档感觉很难理解......似乎是带有美元符号的东西。也许我需要更深入地了解 DO 和美元报价。我用字符串插值交换了美元参数并留下了它。
  • 问题是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" 吗?
  • 哦,我现在明白了,非常感谢您的澄清。好吧,我是在这样的字符串插值的帮助下完成的:_db TEXT := '${process.env.database}'; 你可以写一个DO 不带参数的答案,我将其标记为正确。
  • 如果我没有提到确保以这种方式传递的值应该事先得到正确验证很重要,我会失职。

标签: sql node.js postgresql pg node-postgres


【解决方案1】:

最重要的问题是匿名函数DO 不接受参数,根据文档here。这意味着提供的参数 [process.env.database, process.env.user, process.env.password] 没有地方可去,因为 $* 占位符被埋在函数内部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 2015-06-23
    • 1970-01-01
    • 2017-05-14
    • 2014-11-30
    • 2020-06-24
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多