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

如何在PostgreSQL的updateAll中添加自定义查询条件

解决方案

你当前的写法错误在于将原生SQL字符串直接作为updateAll的条件对象键,该方法的第一个参数要求是与实体属性匹配的条件结构,无法直接识别原生SQL片段。以下两种方案可实现自定义查询逻辑:

方案1:使用QueryBuilder(推荐,灵活性最高)

通过QueryBuilder可以直接编写原生SQL条件,完全支持自定义查询逻辑:

const result = await this.sampleRequestsRepository
  .createQueryBuilder()
  .update()
  .set({ deletedAt: true }) // 修正原代码拼写错误:deleatedAt → deletedAt
  .where(`created BETWEEN NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER -7 AND NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER`)
  .execute();

console.log(result);

方案2:使用Raw函数适配updateAll参数

若坚持使用updateAll,可借助TypeORM提供的Raw函数包裹原生SQL条件,让框架正确解析:
首先导入Raw工具:

import { Raw } from "typeorm";

然后修改调用逻辑:

const result = await this.sampleRequestsRepository.updateAll(
  {
    created: Raw(alias => `${alias} BETWEEN NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER -7 AND NOW()::DATE - EXTRACT(DOW FROM NOW())::INTEGER`)
  },
  { deletedAt: true } // 修正拼写错误
);

console.log(result);

注意事项

  • 原代码中的deleatedAt是拼写错误,正确字段名应为deletedAt,否则更新操作无法匹配目标字段。
  • 使用Raw时,alias参数会自动映射为实体对应的数据库列名(若实体字段与列名一致则直接使用字段名),避免硬编码列名导致的适配问题。

内容的提问来源于stack exchange,提问作者rithuwa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:35:21