2016-05-05 9 views
0

PostgreSQLデータベースをバックエンドとしてNodeJSとpgを使用しています。 Client.queryで単一のクエリを実行すると問題なく動作します。nodejs/pgの複数のパラメータから複数の行を更新する

しかし、私は簡単でエレガントな方法で解決できる課題があります。

私が実行したいと思います:の配列/リストから

UPDATE portfolios SET votes = $1 WHERE id = $2 

[{votes: 5, id: 1}, {votes: 15, id: 1}, {votes: 25, id: 2}] 

は、それが単一Client.query(またはPGと同様の)で行うことができますので、私for(){...}を作る必要はありませんか?

+0

[PostgreSQLを使用して同じクエリで複数の行を更新する](http://stackoverflow.com/questions/18797608/update-multiple-rows-in-same-query-using-postgresql) –

答えて

2

ドライバがこの最終形状にPostgreSQLとのクエリを通過しなければならない:

update portfolios p 
set votes = s.votes 
from unnest(array[(5, 1), (15, 1), (25, 2)]) s (votes int, id int) 
where p.id = s.id 

運転者にこのクエリを渡す:

update portfolios p 
set votes = s.votes 
from unnest($1) s (votes int, id int) 
where p.id = s.id 

パラメータとして適切なアレイと。

ドライバを実行させる代わりに文字列を作成すると、SQLインジェクションに脆弱であることに注意してください。

+0

私は参照してください。 UNNESTのように "[{votes:5、id:1}、{votes:15、id:1}、{votes:25、id:2}]"を正しい配列に変換する簡単な方法はありますか?オブジェクトのリストを受け入れませんか? –

+0

返すタプルの配列をマップすることができないようです: my_array = my_array.map(function(e){return tuple(e.votes、e.id);}) –