我正在使用sequelize连接到SQL Server。这是upsert的基本调用:
RolesPerms.upsert({
// values
role_id: rolePerm.role_id,
permission_name: rolePerm.permission_name
}, {
// options
where: {
role_id: rolePerm.role_id,
permission_name: rolePerm.permission_name
},
returning: true
}).then(result => {
console.log('dv', result[0].dataValues);
returnArr.push(result[0].dataValues);
return result[0].dataValues;
})
查看日志,我看到初始查询如下:
执行(默认):合并为[roles_perms] WITH(HOLDLOCK)AS [roles_perms_target]使用(VALUES(1,N'Role delete','2018-10-03 23:28:58.868 +00:00','2018-10-03 23:28:58.868 +00:00'))AS [roles_perms_source]([role_id],[permission_name],[createdAt], [updatedAt])开启[roles_perms_target]。[role_id] = [roles_perms_source]。[role_id]并且 [roles_perms_target]。[permission_name] = [roles_perms_source]。[permission_name]匹配然后更新集 [roles_perms_target]。[role_id] = 1, [roles_perms_target]。[permission_name] = N'角色删除', [roles_perms_target]。[updatedAt] ='2018-10-03 23:28:58.868 +00:00' 未匹配时插入([role_id],[perm ission_name], [createdAt],[updatedAt])VALUES(1,N'Role delete','2018-10-03 23:28:58.868 +00:00','2018-10-03 23:28:58.868 +00:00')输出 $ action,INSERTED。*;
这之后是此日志消息:
执行(默认):SELECT [role_id],[permission_name],[createdAt], [updatedAt]来自[roles_perms] AS [roles_perms]在哪里 [roles_perms]。[role_id] = 1;
请注意,该SELECT语句如何不使用upsert中定义的WHERE。由于upsert中的两个字段是主键的定义,因此,这将导致产生一条select语句,该语句始终仅获取与role_id匹配的第一项,而不是刚刚更新的实际项。换句话说,大多数情况下结果都是错误的。幸运的是,初始查询确实可以正常工作,因此数据库正常。但是我确实想向调用应用程序报告正确的结果!
这是一个错误还是我错过了文档中的某些内容?
答案 0 :(得分:0)
您看到的第二个查询来自returning: true
,仅用于返回更新的记录,该记录由ID查询,如您在SQL日志中看到的那样。第一个upsert语句确实包含您的条件,具体是:
where: {
role_id: rolePerm.role_id,
permission_name: rolePerm.permission_name
}
在以下SQL中映射到1
和Role delete
:
MERGE INTO ... USING (VALUES(1, N'Role delete', ...
然后将其连接到支持您的模型的表,以检测是否存在匹配项(然后进行更新)(不存在)(插入),以满足“ upsert”的要求。