Sequelize使用LIKE查询'%o%'返回undefined问题求助
排查Sequelize LIKE查询在MySQL 5.7中的问题
我来帮你捋捋这个Sequelize查询遇到的问题,结合我踩过的类似坑,给你几个实用的排查方向:
先确认Op操作符是否正确引入
这绝对是Sequelize新手最容易踩的坑!你得确保已经从Sequelize里解构出Op对象,不然[Op.like]会被当成普通字符串解析,直接导致SQL语法错误。正确的引入方式是:const { Op } = require('sequelize'); // CommonJS语法 // 或者ES6模块的写法: import { Op } from 'sequelize';检查MySQL的大小写敏感性
MySQL 5.7的字符串查询大小写规则是由字段的字符集排序规则决定的。如果你的order_status字段用的是utf8_bin这类区分大小写的规则,那'%open%'只会匹配全小写的"open",像"Open"或者"OPEN"都查不出来。
解决办法有两个:要么把字段的排序规则改成不区分大小写的(比如utf8_general_ci),要么用LOWER()函数统一转换大小写:// 写法一:用Sequelize的函数和字段引用 return await models.Order.findAll({ where: Sequelize.where( Sequelize.fn('LOWER', Sequelize.col('order_status')), 'LIKE', '%open%' ) }); // 写法二:更简洁的Op.iLike(Sequelize会自动转成LOWER逻辑) return await models.Order.findAll({ where: { order_status: { [Op.iLike]: '%open%' } } });打印完整SQL排查语法问题
你提到生成的SQL被截断成了SELECT * FROM orders AS Order WHERE Order.o...,大概率是日志输出的问题。可以手动打印完整的SQL语句,看看是不是字段名拼写错了或者语法有问题:const query = models.Order.findAll({ where: { order_status: { [Op.like]: '%open%' } } }); console.log(query.toString()); // 直接打印完整的SQL这样能一眼看出是不是
order_status字段名写错了,或者表别名有没有问题。兜底方案:原生SQL(万不得已再用)
如果你试过上面的方法都不行,再考虑原生SQL写法,虽然你暂时不想用,但可以作为最后手段:return await models.Order.sequelize.query( 'SELECT * FROM orders WHERE order_status LIKE :status', { replacements: { status: '%open%' }, // 用参数化查询防止SQL注入 model: models.Order, mapToModel: true // 自动映射到Order模型 } );
内容的提问来源于stack exchange,提问作者Henry Arbolaez
相关产品推荐
相关产品推荐

