【问题标题】:Sequelize where clause of upsert isn't respected in return query在返回查询中不遵守 upsert 子句的 Sequelize where 子句
【发布时间】:2019-03-09 06:39:01
【问题描述】:

我正在使用 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;
  })

查看日志,我看到初始查询是这样的:

执行(默认):MERGE INTO [roles_perms] WITH(HOLDLOCK) AS [roles_perms_target] 使用(值(1,N'Role 删除','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]) ON [roles_perms_target].[role_id] = [roles_perms_source].[role_id] AND [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] FROM [roles_perms] AS [roles_perms] WHERE [roles_perms].[role_id] = 1;

注意 SELECT 语句如何不使用 upsert 中定义的 WHERE。因为 upsert 中的两个字段是主键的定义,所以这会导致一个 select 语句,它总是只抓取第一个项目以匹配 role_id,而不是刚刚更新的实际项目。换句话说,大多数时候结果是错误的。幸运的是,初始查询确实可以正常工作,因此 DB 没问题。但我确实想向调用应用程序报告正确的结果!

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

【问题讨论】:

    标签: sql-server sequelize.js


    【解决方案1】:

    您看到的第二个查询来自returning: true,仅用于返回更新的记录,正如您在 SQL 日志中看到的那样,通过 ID 进行查询。第一个 upsert 语句确实包含您的标准,具体来说:

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

    在以下 SQL 中映射到 1Role delete

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 1970-01-01
      • 2011-10-03
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      相关资源
      最近更新 更多