使用Sequelize执行多对多关联查询时出现Error Query.run错误
关联定义细节疏漏
即便你已经在associations.js中配置了多对多关联,仍可能存在细节错误:比如关联时是否正确指定了through参数为中间表模型SalesServices?或者foreignKey和otherKey的字段名是否和中间表里的外键完全匹配?比如Sale关联Service时,foreignKey应该指向中间表中对应Sale主键的字段(比如saleId),otherKey对应Service主键的字段(比如serviceId),顺序搞反会直接导致SQL关联逻辑出错。中间表模型配置有误
检查SalesServices模型的外键字段:字段类型必须和Sale、Service的主键类型完全一致(比如Sale主键是INT,中间表的saleId也得是INT,不能是STRING)。另外,中间表是否正确设置了复合主键(如果你的业务需要的话),或者有没有多余的主键配置干扰关联逻辑。查询的include参数配置错误
调用Sale.findAll时,include数组的配置不能出错:比如是否写错了关联模型的名称(比如把Service写成小写的service,Sequelize对模型名称大小写敏感),或者漏写了through参数。正确的配置示例应该是:Sale.findAll({ include: [{ model: Service, through: SalesServices, attributes: ['id', 'serviceName'] // 按需指定要查询的字段 }] })如果这里的
model引用错误,或者through未指定,都会导致生成的SQL无法正确执行。数据库层面的问题
虽然生成了SQL,但数据库可能存在连接超时、当前操作用户没有查询中间表或关联表的权限,导致SQL执行被拒绝。你可以把生成的SQL复制到数据库客户端(比如Navicat、pgAdmin)手动执行,看是否能正常运行,以此快速排查是否是数据库的问题。表名/字段名大小写不匹配
不同数据库对大小写的敏感度不同(比如PostgreSQL默认区分表名和字段名的大小写,MySQL如果开启了lower_case_table_names也会有影响)。如果模型定义的表名、字段名和数据库实际存在的表名、字段名大小写不一致,会导致SQL找不到对应的对象,触发Query.run错误。Sequelize版本兼容问题
如果你用的Sequelize版本较旧,可能存在多对多关联查询的已知bug,或者语法和新版本不兼容。可以查看对应版本的官方文档,确认关联查询的语法是否正确,或者尝试升级到稳定版测试。
内容的提问来源于stack exchange,提问作者tukitooo1998

