首页 > 解决方案 > Typeorm querybuilder update 获取更新结果

问题描述

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

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。

标签: node.jssql-servertypeorm

解决方案


通常,您无法找到UPDATESQL 中的语句更新了哪些行,因此 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​​then 以查找哪些用户已停用:SELECT userid FROM deactivatedusers最后清除 deactivatedusers 准备下次使用,使用DELETE FROM deactivatedusersTRUNCATE TABLE deactivatedusers

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


推荐阅读