我试图在Sequelize中使用upsert方法,但是我得到了不一致的布尔返回。尽管数据库中的数据更新,但似乎 updatedData 参数始终为false。这是我的代码:
router.post('/deploy', function (req, res) {
var data;
data = req.body;
//Update data in mySQL
db.site.upsert({
name: data.name,
templateId: data.templateId,
siteName: data.siteName,
domain: utils.formatDomain(data.domain),
mainEmail: data.mainEmail,
mainPhone: utils.removePhoneNumberFormat(data.mainPhone),
mainExt: ''
}, {
where: {
domain: data.domain
},
}).then(function (updatedData) {
console.log(updatedData);
if (updatedData) {
console.log('New data written successfully');
return res.status(200).send('New data written');
} else {
console.log('Data did not change from the origin');
return res.status(200).send('Nothing changed');
}
}).catch(function (e) {
console.log('Deploy Controller Error: s% ', e);
return res.status(500).end('unexpected_error');
});
});
我确信我在这里做错了,但是我们非常感谢任何帮助或反馈。谢谢,我希望你过得愉快。 :)
答案 0 :(得分:2)
解决方法1:使用两个Sequelize调用
您可以使用upsert
(或findById
),而不是使用count
,然后执行insert
或update
,具体取决于第一次调用返回的内容。这不会像upsert一样快,但根据你的性能需求,它可能会很好。一些代码:
find_mutate: function find_mutate(id, data) {
return models.site.findById(id)
.then(function insert_or_update_instance(instance) {
if(instance !== null) {
return instance.update(data);
}
else {
return models.site.create(data);
}
});
},
count_mutate: function upsert_using_count_mutate(id, data) {
return models.site.count({ where: { domain: id } })
.then(function insert_or_update_instance(count) {
if(count !== 0) {
return models.site.update(data, { where: { domain: id } });
}
else {
return models.site.create(data);
}
});
}
有关演示此内容的测试脚本,请参阅here。
解决方法2:手动构建原始查询
我没有将它包含在刚刚链接到的github示例中,但您也可以使用Sequelize.query
手动构建和执行upsert查询。我不推荐这个:
也就是说,这是MySQL的一个示例查询:
INSERT INTO `site` (`name`,`domain`,`sq_created_at`,`sq_updated_at`) VALUES ('name1','instance1','2015-11-20 13:24:50','2015-11-20 13:24:50') ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `domain`=VALUES(`domain`), `sq_updated_at`=VALUES(`sq_updated_at`);
解决方法3:更多调试
在3个解决方法中,找出并解决潜在问题可能是您最好的举措。 upsert
作为书面作品*,因此您报告的行为可能实际上是由代码中其他地方的其他错误引起的。
*警告:可能不相关:#4885
对此的一些指示,可能是多余的或不适合您:
node-debug
是一个很棒的工具。rowCount
的值也很有用 注意:Upsert和where
在您的代码示例中,您指定where条件。 upsert
根据对象的主键构建自己的where子句,因此不需要此选项键。