如何使用queryRunner.manager.remove删除指定userId的所有表记录?
解决NestJS+TypeORM批量删除指定userId记录的问题
我看你现在的代码里用了queryRunner.manager.remove(something, {chunk:1000}),但这个方法的作用是删除你传入的something数组里的实体实例,而不是根据条件删除表中所有匹配userId的记录——这就是你没法实现目标的原因啦。
下面给你调整后的完整代码,同时补充几个关键注意点:
import { plainToInstance } from 'class-transformer'; // 若需要转换Dto到实体则引入 async bulkUpdate( where: any = {}, // 调用时传入{ userId: 你的目标ID }即可 something: SomethingDto[], connection: Connection, ) { const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { // 核心修改:用delete方法根据where条件批量删除所有匹配记录 // 这里的SomethingEntity要替换成你实际的实体类 await queryRunner.manager.delete(SomethingEntity, where); // 若Dto和实体字段有差异,先转成实体实例再保存 // const entities = plainToInstance(SomethingEntity, something); // await queryRunner.manager.save(entities, { chunk: 1000 }); // 若Dto与实体字段完全一致,直接保存即可 await queryRunner.manager.save(something, { chunk: 1000 }); await queryRunner.commitTransaction(); return { message: "批量更新完成", success: true }; } catch (error) { if (queryRunner.isTransactionActive) { await queryRunner.rollbackTransaction(); } return Promise.reject(error); } finally { // 务必释放queryRunner,避免数据库连接泄漏 await queryRunner.release(); } }
额外说明:
- 为什么不用
remove?:remove方法需要先从数据库查询出对应的实体,再执行删除,对于批量删除指定条件的场景来说效率很低;而delete可以直接根据条件执行SQL删除,不需要先查数据,更适合你的需求。 - 复杂条件删除:如果需要更灵活的删除逻辑(比如多条件组合),可以用
createQueryBuilder:await queryRunner.manager .createQueryBuilder() .delete() .from(SomethingEntity) .where("userId = :userId", { userId: where.userId }) // 可添加更多条件,比如.andWhere("status = :status", { status: 'active' }) .execute(); - Dto转实体:如果你的
SomethingDto和实体类的字段不完全一致,或者有需要转换的逻辑,记得用class-transformer的plainToInstance把Dto转换成实体实例再保存,避免字段不匹配的问题。
内容的提问来源于stack exchange,提问作者Armen
相关产品推荐
相关产品推荐

