Sequelize v6升级后MySQL中returning: true不生效问题求助
Sequelize v6 + MySQL 获取更新后记录的解决办法
在Sequelize v6中操作MySQL时,update方法的returning参数会被忽略——这是因为MySQL本身的UPDATE语句不支持RETURNING子句(该特性仅适用于PostgreSQL、SQLite等数据库),所以你会得到[undefined, 1]这样的返回值(其中1是受影响的行数)。
要获取更新后的记录,有两种可靠的替代方案:
方案一:先更新再查询
先执行update操作确认记录被修改,再通过主键查询最新的记录:
app.get("/global", async (req, res, next) => { // 执行更新,获取受影响的行数 const [updatedCount] = await Model.update({ total: 11 }, { where: { id: 172 } }); // 处理无记录被更新的情况 if (updatedCount === 0) { return res.json({ success: false, message: "未找到要更新的记录" }); } // 查询更新后的完整记录 const updatedRecord = await Model.findByPk(172); console.log(updatedRecord); res.json({ success: true, data: updatedRecord }); });
方案二:查询后修改并保存
先通过主键查询到目标实例,修改实例属性后调用save()方法,这种方式会自动生成原子性的UPDATE语句,同时直接返回更新后的实例:
app.get("/global", async (req, res, next) => { // 查询目标记录 const record = await Model.findByPk(172); if (!record) { return res.json({ success: false, message: "未找到目标记录" }); } // 修改属性并保存 record.total = 11; const updatedRecord = await record.save(); console.log(updatedRecord); res.json({ success: true, data: updatedRecord }); });
注意:如果你的业务场景存在高并发更新的情况,方案二更安全——因为save()方法会基于实例的主键生成带WHERE条件的UPDATE语句,能避免并发更新导致的数据覆盖问题。
内容的提问来源于stack exchange,提问作者Md Saif Uddin
相关产品推荐
相关产品推荐

