node.js - pg-promise 创建包含使用 $ 参数执行的函数

标签 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);
            });

函数代码可能包含直接在函数本身内部使用的一个或多个 $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/

相关文章:

javascript - 使用连接表续写 self 关系

node.js - 如何使用nodeJS TCP服务器与MongoDB实现 session ?

database - 如何在 SH 脚本中使用 SQL 命令

vbscript - 在 VBScript 中向字符串添加引号

node.js - 意外的 token 非法 - response.write() 错误

node.js - Express.js 是否遵守 RFC-3986 的查询字符串?

python - 带有复合键的 sqlalchemy 辅助表

python - 通过sqlalchemy在postgresql中有两个序列键

xml - 将未转义的 html 插入 django 制作的 rss 提要中

javascript - 在 JavaScript 中正确转义输入值中的字符