【问题标题】:how to bulk update using knexjs如何使用 knexjs 批量更新
【发布时间】:2019-08-28 00:13:22
【问题描述】:

我正在尝试批量更新表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 },
]

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

我已经根据这个解决方案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”处或附近的语法错误

所以我在这里缺少什么。并且有没有人在不使用承诺或蓝鸟的情况下有更好的解决方案然后执行 trx.commit ,这会消耗大量的 CPU 和内存。并且没有达到一次更新 10,000 行的目的

【问题讨论】:

    标签: node.js psql knex.js


    【解决方案1】:

    我在

    中没有看到任何 ON DUPLICATE KEY UPDATE 引用

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 2020-11-02
      • 1970-01-01
      • 2017-11-13
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      相关资源
      最近更新 更多