Hus*_*Far 22 node.js sequelize.js
我需要.upsert()
在sequelize中使用时获取插入/更新记录的id .
现在.upsert()
返回一个布尔值,指示行是创建还是更新.
return db.VenueAddress.upsert({
addressId:address.addressId,
venueId: venue.venueId,
street: address.street,
zipCode: address.zipCode,
venueAddressDeletedAt: null
}).then(function(test){
//test returned here as true or false how can i get the inserted id here so i can insert data in other tables using this new id?
});
Run Code Online (Sandbox Code Playgroud)
Mat*_*ger 14
当OP提出这个问题时,我不认为返回上传的记录是可用的,但此后它已经通过此PR实现.从Sequelize v4.32.1开始,您可以传递一个布尔"返回"作为查询参数,以便在返回带有记录的数组和布尔值之间进行选择,或者只是指示是否创建了新记录的布尔值.
您仍然需要提供要插入的记录的ID,否则将创建新记录.
例如:
const [record, created] = await Model.upsert(
{ id: 1, name: 'foo' }, // Record to upsert
{ returning: true } // Return upserted record
);
Run Code Online (Sandbox Code Playgroud)
我想要upsert返回创建或更新的对象.它不是因为只有PGSQL直接支持它,显然.
所以我创建了一个天真的实现 - 可能以非高效的方式,并且可能具有各种竞争条件,这样做:
Sequelize.Model.prototype.findCreateUpdate = function(findWhereMap, newValuesMap) {
return this.findOrCreate({
where: findWhereMap,
defaults: findWhereMap
})
.spread(function(newObj, created) {
// set:
for(var key in newValuesMap) {
newObj[key] = newValuesMap[key];
}
return newObj.save();
});
};
Run Code Online (Sandbox Code Playgroud)
尝试在游戏中创建/更新移动时的用法(设计示例警报!):
models.Game
.findOne({where: {gameId: gameId}})
.then(function(game) {
return db.Move.findCreateUpdate(
{gameId: gameId, moveNum: game.moveNum+1},
{startPos: 'kr4', endPos: 'Kp2'}
);
});
Run Code Online (Sandbox Code Playgroud)
我知道这是一个旧帖子,但以防万一这对任何人都有帮助
const upsert = async (model: any, values: any, condition: any): Promise<any> => {
const obj = await model.findOne({ where: condition })
if (obj) {
// only do update is value is different from queried object from db
for (var key in values) {
const val = values[key]
if (parseFloat(obj[key]) !== val) {
obj.isUpdatedRecord = true
return obj.update(values)
}
}
obj.isUpdatedRecord = false
return obj
} else {
// insert
const merged = { ...values, ...condition }
return model.create(merged)
}
}
Run Code Online (Sandbox Code Playgroud)
这对我有用:
Model.upsert({
title:your title,
desc:your description,
location:your locations
}).then(function (test) {
if(test){
res.status(200);
res.send("Successfully stored");
}else{
res.status(200);
res.send("Successfully inserted");
}
})
Run Code Online (Sandbox Code Playgroud)
它将根据您的主键检查数据库以查找.如果它找到了,它将更新数据,否则它将创建一个新行/插入到新行.
它不使用 upsert,但.bulkCreate
有一个updateOnDuplicate
参数,它允许您在主键已经存在的情况下更新某些字段(而不是创建新行)。
MyModel.bulkCreate(
newRows,
{
updateOnDuplicate: ["venueId", ...]
}
)
Run Code Online (Sandbox Code Playgroud)
我相信这会返回结果对象,所以我认为这可能会启用您正在寻找的功能?
詹梅尔 说:
这仅受 postgres 支持,因此要保持 API 跨方言一致,这是不可能的。
请参阅: https: //github.com/sequelize/sequelize/issues/3354