如何删除多行 typeorm - postgresql 和 node.js(typescript)

Posted

技术标签:

【中文标题】如何删除多行 typeorm - postgresql 和 node.js(typescript)【英文标题】:How to delete many rows typeorm - postgresql & node.js(typescript) 【发布时间】:2020-10-22 00:49:17 【问题描述】:

嗨,朋友们,这是我的函数,它获取了一个 id 数组,我想一次性擦除行而不是在循环中运行,但找不到解决方案。 非常感谢帮助。

async remove(ids: DeleteEmployeeAnswerDTO): Promise<boolean> 
        if (ids.employeeAnswersIds.length) 
            for (const id of ids.employeeAnswersIds) 
                await EmployeeAnswers.delete(id.id);
            
        
        return true;
    

【问题讨论】:

这对我有用medium.com/@jimkang/typeorm-delete-multiple-records-6119ff8b740 您解决了这个问题吗? 【参考方案1】:

如果您的表有一个 ID 列,那么您应该能够传递 IDs 的数组:

await EmployeeAnswers.delete(ids.employeeAnswersIds);

您还可以在 where 子句中使用 In 指定多个 IDs:

await EmployeeAnswers.delete( id: In(ids.employeeAnswersIds) );

但是,如果您处理具有复合主键的表,例如在我的情况下,以下示例可能是您的解决方案。我对这个答案并不疯狂,但这是我使用DeleteQueryBuilder (docs) 克服这个问题的方法:

async remove(ids: DeleteEmployeeAnswerDTO): Promise<boolean> 
  if (ids.employeeAnswersIds.length) 
    const deleteQueryBuilder = EmployeeAnswer.createQueryBuilder().delete()

    const idClauses = ids.map((_, index) => `ID = :id$index`)
    const idClauseVariables = ids.reduce((value: any, id, index) => 
      value[`id$index`] = id
      return value
    , )

    await deleteQueryBuilder.where(idClauses.join(' OR '), idClauseVariables).execute()
  
  return true;

【讨论】:

由于提问者提供的示例明确表示他的实体只有一个主键,因此我将突出显示您提供的最后一个示例。【参考方案2】:

您可以搜索多条记录,然后删除在单个操作中找到的实体。如果未找到一个或多个实体,则不会删除任何内容。

async removeMany(ids: string[]) 
    const entities = await this.entityRepository.findByIds(ids);
    if (!entities) 
      throw new NotFoundException(`Some Entities not found, no changes applied!`);
    
    return this.entityRepository.remove(entities);
  

【讨论】:

这可以工作,但是该过程包含不必要的查询。如果有大量的 id,第一次查询可能会很慢。 是的,但根据我的经验,如果表中不存在提供的 id,则删除或删除会灾难性地失败。服务器只是崩溃......如果你问我,这太疯狂了。您将如何在单个查询中规避此问题?问候

以上是关于如何删除多行 typeorm - postgresql 和 node.js(typescript)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 typeorm、postgres 中组合 3 列唯一的?

TypeORM 中的 Postgres 枚举

我如何将 Postgres DateRange 类型与 TypeOrm 一起使用

如何以正确的方式将@admin-bro/nestjs 与@admin-bro/typeorm 和postgres 一起使用?

如何使用 TypeORM 为 postgres 数据库和 nodejs 使用参数化查询作为应用程序的后端服务器

使用 typeorm 在 postgres 中搜索数组中的项目