根据这里找到的文档,它声明如下upsert(values, [options]) -> Promise.<created>
插入或更新单个行。如果找到与主键或唯一键上提供的值匹配的行,则将执行更新。请注意,必须在sequelize模型中定义唯一索引,而不仅仅是在表中。否则,您可能会遇到违反唯一约束条件的情况,因为sequelize无法标识应更新的行。
所以我的期望是使用唯一键的upsert应该替换现有的值。然而当我的代码运行而不是更新现有的数据库记录时,它添加了一个新的记录。我做错了什么?
这是我模型的一个样本
'use strict'
module.exports = (db, dataTypes) => {
const titanJob = db.define('titanJob', {
titanId: {
type: dataTypes.STRING,
allowNull: false,
unique: true
},
name: {
type: dataTypes.STRING,
allowNull: false
}
}, {
timestamps: true
})
return titanJob
}
这是我的一个例子
await asyncForEach(res.data.hits.hits, async es => {
const src = es._source
try {
await titanJob.upsert({
name: src.name,
titanId: src.id,
}, { titanId: src.id })
logger.debug(`[${file}] upsert successful`)
} catch (err) {
logger.warn(`[${file}] failed to save to database`)
logger.warn(`[${file}] ${err}`)
}
})
2条答案
按热度按时间dsekswqp1#
首先,您应该在数据表中加入唯一索引(条件约束)。您插入的数据应该包含唯一索引(条件约束)的字段集。
tv6aics12#
下面是一个使用
"sequelize": "^5.21.3"
的示例:index.ts
:执行结果:
没有Assert失败。它按预期工作。请检查数据库中的数据行:
源代码:https://github.com/mrdulin/node-sequelize-examples/tree/master/src/examples/stackoverflow/59686743