SQLAlchemy如何使用LIKE查询ARRAY列中任意元素匹配通配符的记录
问题原因
你现有写法生成的SQL逻辑完全倒置:'abc%' LIKE ANY(file.names)的语义是将数组中的每个元素作为匹配模式,判断固定字符串abc%是否符合该模式,和你需要的「筛选数组中存在至少一个元素符合abc%通配规则」的需求相反,因此返回结果为空。
正确实现方案
原生SQL逻辑(兼容绝大多数支持数组类型的数据库)
通过EXISTS搭配unnest拆解数组后逐行匹配是兼容性最好、性能稳定的写法,以PostgreSQL为例:
SELECT file.id, file.names FROM file WHERE EXISTS ( SELECT 1 FROM unnest(file.names) AS name WHERE name LIKE 'abc%' );
对应的SQLAlchemy查询写法
from sqlalchemy import func, select # 构造子查询:拆解names数组,判断是否存在符合通配规则的元素 match_subquery = select( func.unnest(File.names).label("name") ).where( func.name.like("abc%") ).exists() # 执行查询 result = File.query.where(match_subquery).all()
内容的提问来源于stack exchange,提问作者Wald
相关产品推荐
相关产品推荐

