pg-promise,使用带有嵌套对象的命名参数

pg-promise, using named parameters with nested objects

pg-promise 中使用命名参数时,是否可以引用嵌套对象,如下例所示?

var obj = {
    name: 'John',
    address: {
        postcode: 'abc'
    }
};

db.query('SELECT * FROM users WHERE postcode=${address.postcode} AND name=${name}', obj);

目前对嵌套对象的引用没有用值解析,例如${address.postcode} 保留原样,不会在查询字符串中替换为 'abc'

注意: 这个答案不再有效,因为 v6.10.0 of pg-promise, which started supporting Nested Named Parameters 本机。

问题中提供的代码示例将按原样运行。


仅限pg-promise prior to v6.10.0

库只格式化命名参数,它不评估它们,因此不,你不能这样做,至少不能直接那样做。

但是您可以通过函数使子属性对查询格式化引擎可用:

var obj = {
    name: 'John',
    address: {
        postcode: 'abc'
    },
    addrCode: a => a.address.postcode // alias for accessing a sub-property
};

然后使用WHERE postcode = ${addrCode}.

旧的 / ES5 语法,通过 this 也可以工作:

var obj = {
    name: 'John',
    address: {
        postcode: 'abc'
    },
    addrCode: function(/*a*/) {
        // a = this (can use both)
        return this.address.postcode;
    }
};

更新

可以使客户端评估工作,但只能使用 , , ... 个参数:

db.query('... postcode =  AND name = ', [obj.name, obj.address.postcode]);

注意:您不能直接在查询字符串中使用 ${obj.address.postcode} 之类的评估,因为该值不会被正确转义。