Nodejs续集批量更新

新手上路,请多包涵

有没有办法在 sequelize 中进行批量 upsert。另外,我可以指定用于检查重复项的键吗?

我尝试了以下但没有奏效:

 Employee.bulkCreate(data, {
    updateOnDuplicate: true
});

批量创建工作正常。上面的语句总是在数据库中创建新条目。

原文由 Ashutosh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 972
2 个回答

来自官方 sequelizejs 参考

可以使用 bulkCreateupdateOnDuplicate 选项来完成。

像这样的例子:

 Employee.bulkCreate(dataArray,
    {
        fields:["id", "name", "address"] ,
        updateOnDuplicate: ["name"]
    } )

updateOnDuplicate 是一个字段数组,当主键(或可能是唯一键)匹配行时将更新这些字段。确保您的模型和 dataArray 中至少有一个唯一字段(比如说 id)用于 upsert。

原文由 followtest52 发布,翻译遵循 CC BY-SA 4.0 许可协议

更新(续集 >= 6)

Sequelize 6.x 添加了对所有方言上所有 UPSERT 的支持,因此@followtest52 的回答对 PostgreSQL 也有效。

原创(续集 < 6)

由于答案不支持 PostgreSQL,因此使用 Sequelize 的“最佳”“”替代方法是使用 ON CONFLICT 语句进行手动查询。示例(打字稿):

 const values: Array<Array<number | string>> = [
    [1, 'Apple', 'Red', 'Yummy'],
    [2, 'Kiwi', 'Green', 'Yuck'],
]

const query = 'INSERT INTO fruits (id, name, color, flavor) VALUES ' +
     values.map(_ => { return '(?)' }).join(',') +
     ' ON CONFLICT (id) DO UPDATE SET flavor = excluded.flavor;'

sequelize.query({ query, values }, { type: sequelize.QueryTypes.INSERT })

这将构建如下查询:

 INSERT INTO
    fruits (id, name, color, flavor)
VALUES
    (1, 'Apple', 'Red', 'Yummy'),
    (2, 'Kiwi', 'Green', 'Yuck')
ON CONFLICT (id) DO UPDATE SET
    flavor = excluded.flavor;

可以说,这不是必须手动构建查询的理想解决方案,因为它违背了使用 sequelize 的目的,但如果它是您不需要的一次性查询,则可以使用此方法。

原文由 Can 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏