我们有一个使用 Sequelize 和 postgresql 的节点项目,我需要提高一些端点的性能。代码中有几种情况是对每一行进行更新查询(每行都有不同的数据),即使有 50 行左右,这也会成为一个问题。所以,我正在尝试实现批量更新之类的东西。
Sequelize.Model的bulkCreate方法有选项
updateOnDuplicate
,所以,如果你只传递已经存在的行,你实际上可以将它用作“批量更新”,而且比对每一行进行更新要快得多。例如:
await models.Shipping.bulkCreate(
shippings,
{
fields: ['packageId', 'labelUrl', 'custom'],
updateOnDuplicate: ['label_url', 'custom']
}
)
其中
shippings
是包含行数据的数组。这将更新数据库中每一行的字段 label_url
和 custom
。
但显然,只有将所有必要的行数据传递给bulkCreate 才能做到这一点。如果您只传递要更新的数据,如下所示:
shippings = [{
labelUrl: 'example.com',
custom: 'test
}]
如果您对其他列有
NOT NULL
约束,它将不起作用,因为该列不存在于“插入”数据中。
有没有一种干净的方法来绕过这个?或者也许另一种方法可以快速更新具有不同数据的多行?
我认为 Sequelize 本身并不支持您想要的内容 - 正如您注意到的那样,bulkCreate 需要所有不可为空的值,因为它实际上会创建缺失的行,并更新现有的行。
替代方案:
有一个
model.update(values, {where:})
方法,但这意味着为所有目标行设置相同的值,这可能不是您想要的。
您可以并行执行多个更新(如果需要,使用事务):
await Promise.all(shippings.map(elt => models.Shipping.update(elt, { where: { id: elt.id }, transaction })