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

时间:2017-06-15 14:34:09

标签: javascript named-parameters pg-promise

使用带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'替换。

1 个答案:

答案 0 :(得分:2)

注意:此答案不再有效v6.10.0 pg-promiseNested Named Parameters开始本地支持pg-promise

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

仅适用于v6.10.0之前的http://example.com/Subscriptions/create?defaultValues=

图书馆只格式化命名参数,它不会对它们进行评估,因此不会,你不能这样做,至少不是那样直接。

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

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

然后使用WHERE postcode = ${addrCode}

通过this的旧/ ES5语法也适用:

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

<强>更新

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

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

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