如何使用 knexjs 批量更新

how to bulk update using knexjs

我正在尝试批量更新 table users,其中包含这些列 id(主键)、status(文本)、active(数字)。

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

[ 
     { 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 },
]

active 是以小时为单位的时间。现在我想将此数组批量更新为用户 table。因为每个对象代表 table.

中的一行

我已经根据这个解决方案尝试了这个方法

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);

但是我得到这个错误

error: syntax error at or near "DUPLICATE"

所以我在这里缺少什么。并且有没有人偶然有一个更好的解决方案而不使用 promises 或 bluebird 然后做 trx.commit ,这会消耗大量 cpu 和 ram。并且不执行一次更新 10,000 行的目的

我在

中没有看到任何 ON DUPLICATE KEY UPDATE 参考

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

您可以试试 ON CONFLICT DO UPDATE SET。首先尝试使用普通 SQL 编写一个似乎可以正常工作的查询,然后很容易转换为 javascript 生成的查询。