Search code examples
sqlnode.jspostgresqlpgnode-postgres

bind message supplies 3 parameters, but prepared statement "" requires 0 [Node js, pg]


I want to pass parameters to my pg query like this:

    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]);

But I am getting bind message supplies 3 parameters, but prepared statement "" requires 0. If I do not pass array of parameters, I get there is no parameter $1 error.

So how can I pass parameters to my query?


Solution

  • The overriding issue is the anonymous function DO does not accept parameters, per docs here. This means the parameters supplied, [process.env.database, process.env.user, process.env.password] have no place to go as the $* placeholders are buried inside the function.