如何在Sequelize中查询PostgreSQL数组列包含指定值的行?
在Sequelize中查询PostgreSQL数组字段包含指定元素的记录
针对你需要查询ingredients数组字段包含指定食材的需求,这里提供两种在Sequelize中实现的方法,效果和你给出的原生SQL等价:
方法一:使用原生SQL片段(literal)
这种方式直接复用你熟悉的SQL逻辑,同时通过bind参数避免SQL注入风险:
const targetIngredient = '你要搜索的食材'; // 替换为前端传入的参数 const dishes = await Dish.findAll({ where: sequelize.literal(`? = ANY(ingredients)`), bind: [targetIngredient] });
不推荐直接拼接字符串(存在注入风险),务必优先使用bind参数传递变量。
方法二:使用Sequelize的Op.contains操作符
Sequelize针对PostgreSQL数组类型提供了Op.contains操作符,它对应PostgreSQL的@>运算符,对于单个元素的查询,效果和=ANY完全一致:
const { Op } = require('sequelize'); const targetIngredient = '你要搜索的食材'; const dishes = await Dish.findAll({ where: { ingredients: { [Op.contains]: [targetIngredient] } } });
这种写法更符合Sequelize的ORM风格,无需手动拼接SQL,安全性更高。
额外说明
确保你的Dish模型中ingredients字段的定义正确,示例如下:
const { DataTypes } = require('sequelize'); const Dish = sequelize.define('Dish', { ingredients: { type: DataTypes.ARRAY(DataTypes.STRING), allowNull: false }, // 其他模型字段... });
内容的提问来源于stack exchange,提问作者Juan Andrés Macri Ibañez
相关产品推荐
相关产品推荐

