如何让Sequelize的destroy方法返回被删除行的实例?
解决Sequelize destroy方法无法返回被删除实例的问题
Sequelize的destroy方法默认返回的是被删除的行数,这就是你看到控制台输出1 5 deleteone的原因(数字1代表成功删除1行数据)。要获取被删除行的实例,有两种可行方案:
方案1:先查询实例再删除(兼容所有数据库)
先通过findByPk或其他查询方法获取要删除的实例,再调用实例的destroy方法,这样就能直接拿到被删除的实例对象:
exports.deleteCustomer = asyncHandler(async (req, res) => { const id = req.params.id; if (!id) { res.status(400).send({ message: "can't remove, invalid customer" }); return; } try { // 先查询目标实例 const customer = await Customer.findByPk(id); if (!customer) { res.status(404).send({ message: "Customer not found" }); return; } // 调用实例的destroy方法完成删除 await customer.destroy(); console.log(customer, id, "deleted customer"); res.status(200).json(customer); } catch (error) { res.status(400); throw new Error(error.message || "can't remove Customer"); } })
方案2:使用destroy的returning选项(仅支持部分数据库)
如果你的项目使用PostgreSQL、SQLite等支持RETURNING语句的数据库,可以直接在destroy配置中添加returning: true,此时方法会返回一个包含[删除行数, 被删除实例数组]的数组:
exports.deleteCustomer = asyncHandler(async (req, res) => { const id = req.params.id; if (!id) { res.status(400).send({ message: "can't remove, invalid customer" }); return; } try { const [deletedCount, deletedCustomers] = await Customer.destroy({ where: { id: id }, returning: true // 开启返回被删除实例 }); if (deletedCount === 0) { res.status(404).send({ message: "Customer not found" }); return; } console.log(deletedCustomers[0], id, "deleted customer"); res.status(200).json(deletedCustomers[0]); } catch (error) { res.status(400); throw new Error(error.message || "can't remove Customer"); } })
注意:MySQL不支持
returning选项,这种情况下只能使用方案1。
内容的提问来源于stack exchange,提问作者Nimeth Nimdinu
相关产品推荐
相关产品推荐

