如何使用 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 生成的查询。
我正在尝试批量更新 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 生成的查询。