2017-06-15 4 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

注:この答えは、もはや有効ではないネイティブNested Named Parametersをサポートし始めpg-promisev6.10.0、以来。

質問に記載されているコード例は、そのまま動作します。


のみ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}を使用しています。

this作品を通じて

し、古い/ ES5構文、:

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

ありがとう@ 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

関連する問題