You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:25:43