我正在尝试通过pg-promise运行数据库创建脚本。 在nodeJS中执行命令的位如下:
this.db.any(sql, [])
.then((data: any) => {
resolve(data);
})
.catch((error: any) => {
console.log(sql);
reject(error);
});
函数代码可能包含一个或多个直接在函数内部使用的$变量(这就是为什么我在上面的任何一个中传递一个空数组的原因)。 execute语句中的参数有几种不同的类型。一个例子如下:
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: Variable $1 out of range. Parameters array length: 0
我试图找到摆脱美元符号的方法,到目前为止没有运气。 这是完全不行,还是有办法做我还不知道的事情?
答案 0 :(得分:1)
在pg-promise中,为了执行这样的预格式化SQL,您需要确保查询方法不会尝试格式化它。
这意味着传递undefined
表示值,或者根本不传递任何内容:
this.db.any(sql)
传入[]
导致尝试使用$1, $2, ...
格式格式化SQL的方法,因此就会在找到错误时获得错误。