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?
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.