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

如何在TypeORM原生Update查询中返回更新行的ID及其他字段?

在TypeORM原生UPDATE查询中获取被更新行的ID及其他字段

你的SQL语法属于PostgreSQL风格,PostgreSQL支持通过RETURNING子句直接返回被更新行的指定字段,只需在UPDATE语句末尾添加该子句即可实现需求。

修改后的查询代码如下:

const slots = await manager.query(`
  UPDATE slot
  SET status = 'void', void_reason = 'Billing - incomplete verification'
  WHERE start_date > NOW() - INTERVAL '1 days'
    AND status = 'void'
  RETURNING id, status, void_reason, start_date; -- 列出你需要获取的字段
`);

执行后,slots会是一个数组,每个元素对应一条被更新的记录,包含你在RETURNING后指定的所有字段(如id、status等)。

如果是MySQL这类不支持RETURNING的数据库,需要借助事务分步实现:先查询符合条件的记录ID,再执行更新操作,最后根据ID查询更新后的完整字段。示例代码如下:

await manager.transaction(async (txManager) => {
  // 先查询符合条件的记录ID
  const targetIds = await txManager.query(`
    SELECT id FROM slot
    WHERE start_date > NOW() - INTERVAL 1 DAY
      AND status = 'void'
  `).then(rows => rows.map(row => row.id));

  // 执行更新
  await txManager.query(`
    UPDATE slot
    SET status = 'void', void_reason = 'Billing - incomplete verification'
    WHERE id IN (${targetIds.join(',')})
  `);

  // 查询更新后的完整记录
  const slots = await txManager.query(`
    SELECT id, status, void_reason, start_date FROM slot
    WHERE id IN (${targetIds.join(',')})
  `);
  return slots;
});

注意:MySQL的INTERVAL语法不需要单引号,需写成INTERVAL 1 DAY。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:45:34