Node.js中的PostgreSQL多行更新

正如我已经在这里find在Stackoverflow有可能通过做这样的事情更新一个查询中的多个行

update test as t set column_a = c.column_a, column_c = c.column_c from (values ('123', 1, '---'), ('345', 2, '+++') ) as c(column_b, column_a, column_c) where c.column_b = t.column_b; 

特别感谢@罗曼·贝卡的明确答复。

现在我试图将这种更新方式与NodeJS中的postgreSQL数据库进行查询合并。

这里是我的代码片断:

 var requestData = [ {id: 1, value: 1234} {id: 2, value: 5678} {id: 3, value: 91011} ] client.connect(function (err) { if (err) throw err; client.query(buildStatement(requestData), function (err, result) { if (err) throw err; res.json(result.rows); client.end(function (err) { if (err) throw err; }); }); }); var buildStatement = function(requestData) { var params = []; var chunks = []; for(var i = 0; i < requestData.length; i++) { var row = requestData[i]; var valuesClause = []; params.push(row.id); valuesClause.push('$' + params.length); params.push(row.value); valuesClause.push('$' + params.length); chunks.push('(' + valuesClause.join(', ') + ')'); } return { text: 'UPDATE fit_ratios as f set ratio_budget = c.ratio_budget from (VALUES ' + chunks.join(', ') + ') as c(ratio_label, ratio_budget) WHERE c.ratio_label = f.ratio_label', values: params } } 

我没有得到一个错误,但它并没有更新我的表,我真的不知道这里出了什么问题。 也许我的查询代码中的语法错误? 在NodeJS pg包中更新时,我只是没有find多行查询的具体例子

下面的例子是基于库pg-promise和它的方法helpers.update :

 // library initialization, usually placed in its own module: const pgp = require('pg-promise')({ capSQL: true // capitalize all generated SQL }); const db = pgp(/*your connection details*/); // records to be updated: const updateData = [ {id: 1, value: 1234}, {id: 2, value: 5678}, {id: 3, value: 91011} ]; // declare your ColumnSet once, and then reuse it: const cs = new pgp.helpers.ColumnSet(['?id', 'value'], {table: 'fit_ratios'}); // generating the update query where it is needed: const update = pgp.helpers.update(updateData, cs) + ' WHERE v.id = t.id'; //=> UPDATE "fit_ratios" AS t SET "value"=v."value" // FROM (VALUES(1,1234),(2,5678),(3,91011)) // AS v("id","value") WHERE v.id = t.id // executing the query: db.none(update) .then(()=> { // success; }) .catch(error=> { // error; }); 

这种产生多行更新的方法可以被表征为:

  • 非常快,因为它依赖于实现用于查询生成的智能caching的typesColumnSet
  • 完全安全,因为所有的数据types都要通过库的查询格式化引擎,以确保一切都格式化和正确转义。
  • 由于列定义支持高级ColumnConfig语法,因此非常灵活。
  • 由于pg-promise实现的简化接口,非常易于使用。

请注意,我们使用? 在列id前面指示该列是条件的一部分,但不被更新。 有关完整的列语法,请参见类Column和ColumnConfig结构。


相关问题: 使用pg-promise的多行插入 。

首先,我确实接受了@ vitaly-t的答案,因为他教会我使用更好,更快的图书馆承诺 ,它确实解决了我的问题。 (期)

但是为了回答我自己的问题,最终可能会遇到同样的问题,并希望留在图书馆pg ,这里是我犯了错误(这只是语法)

在我原来的代码,我有这条线在最后

 return { text: 'UPDATE fit_ratios as f set ratio_budget = c.ratio_budget from (VALUES ' + chunks.join(', ') + ') as c(ratio_label, ratio_budget) WHERE c.ratio_label = f.ratio_label', values: params } } 

我第一次看到这个很难理解,所以犯了一些错误很容易。 改变这一行代码,你看到下面解决了我原来的问题

 return { text: 'UPDATE fit_ratios as f set ratio_budget = c.value from (VALUES ' + chunks.join(', ') + ') as c(id, value) WHERE c.id = f.ratio_id', values: params } 

我只是错过了使用列名称,而不是使用我的对象的键。 (egcratio_label到c.id,…)