Sequelize如何在SQLite表列中存储字符串数组并实现查询
在SQLite中存储字符串数组并实现查询的正确方式
问题根源
直接对JSON列使用[Op.like]失效,核心原因有两点:一是SQLite的JSON列存储的是带结构化格式的字符串(比如数组会被序列化为["张三","李四"]这类带引号、逗号的格式),普通like查询会被这些格式字符干扰,无法精准匹配数组元素;二是Sequelize的Op.like默认对列值做纯字符串匹配,没有适配JSON的结构特性。
可行解决方案
方法1:用SQLite内置JSON函数实现精准查询
SQLite提供json_each函数可将JSON数组拆分为独立行,结合该函数能直接匹配数组内的元素。在Sequelize中可以通过sequelize.literal编写原生SQL实现:
// 基础写法(注意:直接拼接字符串有SQL注入风险) const results = await Model.findAll({ where: sequelize.literal(`EXISTS ( SELECT 1 FROM json_each(actors) WHERE json_each.value LIKE '%${actor}%' )`) });
更安全的参数绑定写法:
const results = await Model.findAll({ where: sequelize.literal(`EXISTS ( SELECT 1 FROM json_each(actors) WHERE json_each.value LIKE ? )`, [`%${actor}%`]) });
方法2:适配JSON格式的like查询(简易但不严谨)
如果坚持用Op.like,可以把查询条件调整为包含JSON元素的格式特征(比如双引号),示例:
{ actors: { [Op.like]: `%"${actor}"%`, }, }
比如要匹配张三,实际查询的是%"张三"%,这样能命中JSON数组中的"张三"元素。但这种方法对包含特殊字符(如引号)的元素会失效,仅适合简单场景。
方法3:使用Sequelize原生JSON操作符(需新版本支持)
如果你的Sequelize版本较新,可直接用Op.contains结合JSON数组做查询:
{ actors: { [Op.contains]: [actor] } }
注意:该方式需要确保SQLite启用了JSON1扩展(多数现代版本默认已启用),且Sequelize配置正确支持该操作符。
重要提示
- 确认SQLite已启用JSON1扩展,否则所有JSON相关函数无法正常工作。
- 始终优先使用参数绑定方式编写查询,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Matviy
相关产品推荐
相关产品推荐

