Sequelize操作MSSQL执行DELETE原生查询未返回元数据与结果问题
解决Sequelize在MSSQL中执行原生DELETE查询返回空数组的问题
我之前也碰到过类似的跨数据库差异问题,Sequelize对MSSQL和MySQL的原生查询结果处理逻辑确实不一样。
问题根源
当你不指定type参数执行原生DELETE查询时,MSSQL的驱动不会返回预期的元数据(比如受影响行数),而是返回[ [], [] ]——这是因为MSSQL默认不会为DELETE操作返回结果集,而Sequelize在未明确查询类型时,会按通用查询格式解析,导致得到空数组。而MySQL的驱动在这种场景下会主动返回元数据,所以结果符合预期。
解决方案1:指定查询类型并使用参数化查询
添加{ type: sequelize.QueryTypes.DELETE }参数后,Sequelize会针对MSSQL优化结果返回,直接给出受影响的行数,而非空数组。同时建议用参数化查询避免SQL注入:
const deleteResult = await sequelize.query( 'DELETE FROM vehicle where vehicleId IN (:vehicleIds)', { type: sequelize.QueryTypes.DELETE, replacements: { vehicleIds: ['1', '2', '3'] } } ); console.log(deleteResult); // 输出受影响的行数,比如3
解决方案2:使用Sequelize模型的destroy方法(更推荐)
如果不是必须用原生查询,直接用模型的destroy方法会更省心——Sequelize会自动适配不同数据库的行为,统一返回受影响行数:
const deletedCount = await Vehicle.destroy({ where: { vehicleId: ['1', '2', '3'] } }); console.log(deletedCount); // 同样返回受影响的行数
补充说明
文档里提到添加type: sequelize.QueryTypes.DELETE会“仅返回...”的内容,其实就是指针对DELETE操作的核心结果(受影响行数),这正是你需要的元数据之一。MSSQL不像MySQL那样会在默认查询下附带这些信息,必须通过指定类型来触发正确的解析逻辑。
内容的提问来源于stack exchange,提问作者Reynard D
相关产品推荐
相关产品推荐

