2017-06-15 42 views
2

使用帶有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'

+0

答案已更新。自[v6.10.0](https://github.com/vitaly-t/pg-promise/releases/tag/v.6.10.0)開始,該庫支持嵌套屬性。 –

回答

2

NOTE:此答案自v6.10.0pg-promise開始支持Nested Named Parameters原生支持。

而問題中提供的代碼示例將按原樣工作。


只爲pg-promise之前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; 
    } 
}; 

UPDATE

它有可能使客戶端的評估工作,但只能用$1, $2, ...參數:

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

注意:您不能直接使用${obj.address.postcode}等評估在查詢字符串內部,因爲該值不會被正確轉義。

+0

Thanks @ vitaly-t。那麼評估是否發生在數據庫級別? – arm5472

+0

@ arm5472圖書館從來沒有做任何評估,所以我不知道你的意思。庫的查詢格式引擎在您使用命名參數時插入所有值。 –

+0

當我使用[link](http://vitaly-t.github.io/pg-promise/global.html#event:query)記錄查詢時,查詢屬性顯示'$ {name}'被替換爲'John',在它碰到數據庫之前:'SELECT * FROM users WHERE postcode = $ {address.postcode} AND name ='John'' – arm5472

相關問題