对返回查询中不遵守upsert子句的地方进行排序

时间:2018-10-03 23:46:38

标签: sql-server sequelize.js

我正在使用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匹配的第一项,而不是刚刚更新的实际项。换句话说,大多数情况下结果都是错误的。幸运的是,初始查询确实可以正常工作,因此数据库正常。但是我确实想向调用应用程序报告正确的结果!

这是一个错误还是我错过了文档中的某些内容?

1 个答案:

答案 0 :(得分:0)

您看到的第二个查询来自returning: true,仅用于返回更新的记录,该记录由ID查询,如您在SQL日志中看到的那样。第一个upsert语句确实包含您的条件,具体是:

where: {
  role_id: rolePerm.role_id,
  permission_name: rolePerm.permission_name
}

在以下SQL中映射到1Role delete

MERGE INTO ... USING (VALUES(1, N'Role delete', ...

然后将其连接到支持您的模型的表,以检测是否存在匹配项(然后进行更新)(不存在)(插入),以满足“ upsert”的要求。