如何在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
相关产品推荐
相关产品推荐

