如何在Sequelize的QueryInterface Where子句中定义表别名?
在Sequelize QueryInterface的Where子句中定义表别名的正确方式
当使用Sequelize的QueryInterface构建无模型查询时,直接在where对象的键中编写e.eventid会被错误解析为第一个表别名下的列,导致生成的SQL不符合预期。以下是两种可行的解决方法:
方法1:使用Sequelize.col()明确指定带别名的列
通过Sequelize.col()方法可以直接声明包含表别名的完整列名,避免queryGenerator错误关联表:
const queryInterface = this.sequelize.getQueryInterface(); const queryGenerator = queryInterface.queryGenerator as SequelizeQueryGenerator; const { Op, col } = require('sequelize'); const whereObject = [ { venueid: { [Op.lt]: 50 } }, { [col('e.eventid')]: { [Op.eq]: 100 } } ]; const sql = queryGenerator.selectQuery( [ ['venue', 'v'], ['event', 'e'] ], { where: whereObject }, null );
方法2:按表别名嵌套条件对象
将where条件按表别名分组嵌套,queryGenerator会自动识别并关联对应的表别名:
const queryInterface = this.sequelize.getQueryInterface(); const queryGenerator = queryInterface.queryGenerator as SequelizeQueryGenerator; const { Op } = require('sequelize'); const whereObject = { v: { venueid: { [Op.lt]: 50 } }, e: { eventid: { [Op.eq]: 100 } } }; const sql = queryGenerator.selectQuery( [ ['venue', 'v'], ['event', 'e'] ], { where: whereObject }, null );
以上两种方法都能生成符合预期的SQL:
SELECT * FROM "venue" AS "v", "event" AS "e" WHERE ("v"."venueid" < 50 AND "e"."eventid" = 100);
原写法错误原因
直接使用['e.eventid']作为where条件的键时,queryGenerator会默认将其归属到查询的第一个表(venue AS v),因此解析为"v"."e.eventid",而非识别e为表别名。
内容的提问来源于stack exchange,提问作者Zainelow
相关产品推荐
相关产品推荐

