我正在尝试通过 pg-promise 运行数据库创建脚本。 在nodeJS中执行命令的位如下:
this.db.any(sql, [])
.then((data: any) => {
resolve(data);
})
.catch((error: any) => {
console.log(sql);
reject(error);
});
函数代码可能包含直接在函数本身内部使用的一个或多个 $variables(这就是为什么我在上面的 any 中传递一个空数组的原因)。执行语句内的参数有几种不同的类型。一个例子如下:
CREATE OR REPLACE FUNCTION ze_function(i_a_parameter TEXT, i_a_value INTEGER, i_another_value TEXT)
RETURNS integer
AS $function$
DECLARE
v_rows_saved integer := 0;
BEGIN
EXECUTE format('UPDATE %I_table
SET
the_field = $1
the_other_field = $2', i_a_parameter)
USING i_a_value, i_another_value;
GET DIAGNOSTICS v_rows_saved = ROW_COUNT;
RETURN v_rows_saved;
END;
$function$
LANGUAGE plpgsql;
它生成的错误如下:
RangeError:变量 $1 超出范围。参数数组长度:0
我试图找到摆脱美元符号的方法,但到目前为止还没有成功。 这是完全不行吗,还是有什么方法可以做我还不知道的事情?
最佳答案
在 pg-promise ,为了执行这样的预格式化 SQL,您需要确保查询方法不会尝试对其进行格式化。
这意味着要么传入 undefined
值,要么什么也不传入:
this.db.any(sql)
传入 []
会导致方法尝试使用 $1, $2, ...
格式格式化 SQL,因此您得到的错误与它所发现的一样那些。
关于node.js - pg-promise 创建包含使用 $ 参数执行的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49294380/