Sequelize 6.20.1设置attributes查询仍返回所有表列如何解决
Sequelize 6.20.1 指定attributes参数未按预期过滤查询字段
问题复现
查询时传入attributes参数指定仅返回目标字段:
messengerModel.findAll({ attributes: ['message_title'] })
预期仅查询message_title列,实际生成的SQL查询了messenger表所有字段:
SELECT `id`, `room_id`, `sender`, `message_id`, `message_source`, `status`, `message_content`, `message_uid`, `recipient`, `conversation`, `mail_date`, `person_id`, `message_title` FROM `messenger`
使用环境:Sequelize 6.20.1
排查方向与解决方案
- 默认作用域配置覆盖
这是该问题最高发的原因。如果模型定义时在defaultScope中显式配置了全量attributes列表,findAll中直接传入的attributes不会覆盖默认作用域的配置,需要先清除默认作用域再发起查询:// 调用unscoped清除默认作用域配置 messengerModel.unscoped().findAll({ attributes: ['message_title'] }) - 查询钩子/第三方插件篡改配置
检查Sequelize实例是否注册了beforeFind等全局查询钩子,或引入了自动注入查询字段的第三方插件,这类逻辑如果处理不当会直接覆盖传入的attributes参数。调整钩子逻辑的字段合并规则,避免直接覆写用户传入的查询配置即可。 - 参数传值异常
打印传入findAll方法的完整配置对象,确认attributes字段没有被嵌套在其他配置项下,也没有在参数传递过程中被修改为undefined或全量字段数组——Sequelize在attributes为假值时会默认查询所有字段。 - 版本已知bug
Sequelize 6.20.1存在作用域合并时attributes配置被意外覆盖的边缘问题,如果以上排查都无效,可以升级到6.x系列最新稳定小版本修复该问题。
排查时可以开启Sequelize的SQL日志功能,每次调整后直接检查生成的SELECT语句字段列表,确认修复效果。
内容的提问来源于stack exchange,提问作者Thierry
相关产品推荐
相关产品推荐

