如何使用knexjs批量更新

时间:2019-08-26 00:06:29

标签: node.js psql knex.js

我正在尝试批量更新表users,该表包含这些列id(主键),状态(文本),活动(数字)。

我从后端接收到的数组是这样的:

[ 
     { id: 33715, status: 'online', active: 10 },
     { id: 39129, status: 'offline', active: 0.1 },
     { id: 36090, status: 'loggedin', active: 24 },
     { id: 34452, status: 'loggedout', active: 1 },
]

活动时间以小时为单位。现在,我想将此数组批量更新为用户表。因为每个对象代表表格中的一行。

我已经根据此解决方案Patrick Motard尝试了这种方法

function bulkUpdate (records) {
  var updateQuery = [
      'INSERT INTO users (id, status, active) VALUES',
      _.map(records, () => '(?)').join(','),
      'ON DUPLICATE KEY UPDATE',
      'status = VALUES(status),',
      'active = VALUES(active)'
  ].join(' '),

  vals = [];
  _(records).map(record => {
    vals.push(_(record).values());
  });
  return knex.raw(updateQuery, vals)
  .catch(err => {
    console.log(err)
  });
}
bulkUpdate(response);

但我收到此错误

  

错误:“ DUPLICATE”处或附近的语法错误

所以我在这里想念的是什么。并在没有使用promise或bluebird的情况下偶然地找到一个更好的解决方案,然后再做trx.commit,这会消耗大量的cpu和ram。并且没有达到立即更新10,000行的目的

1 个答案:

答案 0 :(得分:2)

我在

中看不到任何ON DUPLICATE KEY UPDATE参考

https://www.postgresql.org/docs/9.5/sql-insert.html

您可以尝试ON CONFLICT DO UPDATE SET。首先尝试使用普通SQL编写看起来正确的查询,然后将其转换为JavaScript生成的查询很容易。