为什么Sequelize执行原生SQL查询会返回重复的数据集?
问题原因
该问题和你猜测的双外键关联配置无关,你使用的是Sequelize原生SQL查询接口,不会触发ORM的关联解析逻辑,模型关联定义不会对本次查询结果产生影响。
故障根本原因是Sequelize原生database.query方法的默认返回规则:默认情况下该方法会返回长度为2的数组,第一个元素是匹配查询条件的结果集,第二个元素是数据库返回的查询元数据(包含字段描述、影响行数等信息)。你遇到的两份重复数据是错觉,MySQL执行SELECT返回的元数据刚好被Sequelize解析为和结果集格式一致的结构,本质上第二个数组并不是实际的业务数据。
解决方法
有两种常用修复方案,任选其一即可:
- 方案1:通过数组解构直接取结果集
// 仅对返回数组的第一个元素进行赋值 const [reports] = await database.query( 'SELECT r.id, r.type, r.fileCid, r.madeById, r.reportedId, u1.username as reportedName, u2.username as madeBy \ FROM reports r \ left join users u1 on u1.id = r.reportedId \ inner join users u2 on u2.id = r.madeById ' ); return reports;
- 方案2:指定查询类型为SELECT,让Sequelize直接返回结果集
// 顶部引入QueryTypes常量 const { QueryTypes } = require('sequelize'); const reports = await database.query( 'SELECT r.id, r.type, r.fileCid, r.madeById, r.reportedId, u1.username as reportedName, u2.username as madeBy \ FROM reports r \ left join users u1 on u1.id = r.reportedId \ inner join users u2 on u2.id = r.madeById ', // 新增查询类型配置 { type: QueryTypes.SELECT } ); return reports;
通用排查思路
后续遇到Sequelize查询结果和直接执行SQL结果不一致的情况,可按以下顺序排查:
- 首先将SQL直接放到数据库中执行,确认SQL本身逻辑正确,结果符合预期
- 如果使用的是原生查询接口,优先核对官方文档的返回规则,确认是否有默认的结构包装
- 如果使用的是ORM关联查询(非原生SQL)出现重复数据,再检查关联别名、外键配置、
distinct去重参数是否正确。
内容的提问来源于stack exchange,提问作者Fnr
相关产品推荐
相关产品推荐

