node.js - 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。
解决方案
通常,您无法找到UPDATE
SQL 中的语句更新了哪些行,因此 tyeorm 无法告诉您。
如果您真的需要知道哪些行已更新,这里有几个解决方案。
在继续之前,问为什么你需要知道?你真的需要知道吗?
如果经过仔细考虑,您发现您需要知道哪些行已更新,有几种解决方案:
在您的代码中,找到要删除的用户,然后一次删除一个,同时记录每个用户的信息。
在数据库中创建一个表,其中包含要停用的用户 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 deactivatedusers
或TRUNCATE TABLE deactivatedusers
由于您使用的是 MS SQL Server,因此这提供了OUTPUT INTO专门用于执行您所要求的操作(非标准 SQL,因此仅适用于此 DBMS)。如果您决定使用这种方法,您应该编写一个存储过程来进行更新并将更新后的数据返回给调用者,然后从 typeorm 调用这个存储过程。
推荐阅读
- css - css子选择器之后/之前应该有一个空格吗?
- android - 如何动态改变 ListView 的高度
- r - 在多行中在 R 中进行网络抓取时缺少行 - 从印度的 NSE 索引中抓取时
- c# - 如果将两个类的函数放在一个委托中会发生什么?
- asp.net-mvc - 嵌套局部视图或多个局部视图最佳实践
- python - 尝试使用 pip 安装或更新水泥给出“ImportError:无法导入名称 ABC”
- wget - wget 下载 html 文件,但我需要一个 fasta 文件
- html - 文件夹结构内的多个 index.html 文件
- java - 如何使用java8中的方法引用打印多个参数
- java - 我应该使用模型类还是有效负载类来序列化 json 响应