pg-promise使用$参数创建包含execute的函数

时间:2018-03-15 08:14:28

标签: node.js postgresql escaping pg-promise dollar-sign

我正在尝试通过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

我试图找到摆脱美元符号的方法,到目前为止没有运气。 这是完全不行,还是有办法做我还不知道的事情?

1 个答案:

答案 0 :(得分:1)

pg-promise中,为了执行这样的预格式化SQL,您需要确保查询方法不会尝试格式化它。

这意味着传递undefined表示值,或者根本不传递任何内容:

this.db.any(sql)

传入[]导致尝试使用$1, $2, ...格式格式化SQL的方法,因此就会在找到错误时获得错误。