【问题标题】:Typeorm querybuilder update get updated resultTypeorm querybuilder update 获取更新结果
【发布时间】:2021-06-18 20:43:26
【问题描述】:

我正在运行一个查询构建器,它根据上次登录日期更新多个用户,这意味着我不知道哪些用户正在更新。这是我的代码,它没有提供有关它更新了哪些用户的信息。

await getConnection()
  .createQueryBuilder()
  .update(User)
  .set({
    isDeactivated: true
  })
  .where('lastConnected < :someTimeAgo', { someTimeAgo })
  .andWhere('isDeactivated = :isDeactivated', { isDeactivated: false })
  .execute()
  .then(result => {
    // Result: UpdateResult { generatedMaps: [], raw: undefined }
  })

如何访问更新的数据?数据库是 SQL Server。

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/47792808/…
  • 您是否在“确实提供了有关它更新了哪些用户的信息”中缺少“not”(我看到您最初写的是“确实提供了有关它更新了哪些用户的任何信息”,“not”似乎失踪)。

标签: node.js sql-server typeorm


【解决方案1】:

通常您无法找到 SQL 中的 UPDATE 语句更新了哪些行,因此 tyeorm 无法告诉您。

如果您真的需要知道更新了哪些行,这里有几个解决方案。

在继续之前,请询问您为什么需要知道?你真的需要知道吗?

如果经过仔细考虑,您发现需要知道哪些行被更新了,有几种解决方案:

  1. 在您的代码中,找到要删除的用户,然后一次删除一个,同时记录每个用户的信息。

  2. 在数据库中创建一个表,其中包含要停用的用户 ID。首先填充此表:INSERT INTO deactivatedusers (userid) SELECT userid FROM users WHERE ...,然后运行 ​​UPDATE users SET isDeactivated = 1 WHERE userid IN SELECT userid FROM deactivatedusers,然后查找哪些用户已停用:SELECT userid FROM deactivatedusers,最后清除已停用的用户,以便下次使用,使用 DELETE FROM deactivatedusersTRUNCATE TABLE deactivatedusers

  3. 由于您使用的是 MS SQL Server,这提供了 OUTPUT INTO 专门用于执行您的要求(非标准 SQL,因此仅适用于此 DBMS)。如果你决定使用这种方法,你应该编写一个存储过程来进行更新并将更新后的数据返回给调用者,然后从 typeorm 调用这个存储过程。

【讨论】:

  • 由于 SQL 没有提供数据,TypeORM 无法告诉我是有道理的。我最终得到了一个接近您的解决方案 1 的解决方案。首先,我找到要停用的用户并将它们添加到一个数组中,然后进行批量更新,在所有这些用户上设置 isDeactivated,然后再为所有新停用的用户编写日志.感谢您的回复
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2021-04-28
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多