有没有办法在 sequelize 中进行批量 upsert。另外,我可以指定用于检查重复项的键吗?
我尝试了以下但没有奏效:
Employee.bulkCreate(data, {
updateOnDuplicate: true
});
批量创建工作正常。上面的语句总是在数据库中创建新条目。
原文由 Ashutosh 发布,翻译遵循 CC BY-SA 4.0 许可协议
有没有办法在 sequelize 中进行批量 upsert。另外,我可以指定用于检查重复项的键吗?
我尝试了以下但没有奏效:
Employee.bulkCreate(data, {
updateOnDuplicate: true
});
批量创建工作正常。上面的语句总是在数据库中创建新条目。
原文由 Ashutosh 发布,翻译遵循 CC BY-SA 4.0 许可协议
Sequelize 6.x 添加了对所有方言上所有 UPSERT 的支持,因此@followtest52 的回答对 PostgreSQL 也有效。
由于答案不支持 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 许可协议
5 回答4.8k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
5 回答1.8k 阅读
2 回答1.3k 阅读✓ 已解决
3 回答2k 阅读
1 回答3.2k 阅读
来自官方 sequelizejs 参考。
可以使用
bulkCreate
和updateOnDuplicate
选项来完成。像这样的例子:
updateOnDuplicate
是一个字段数组,当主键(或可能是唯一键)匹配行时将更新这些字段。确保您的模型和dataArray
中至少有一个唯一字段(比如说 id)用于 upsert。