
在 SQLAlchemy ORM 中,可通过 sqlalchemy.all_() 函数配合 like() 方法,安全、声明式地实现 PostgreSQL 的 LIKE ALL (array[...]) 语义,避免使用原生 SQL,同时确保所有通配符模式均被满足。
在 sqlalchemy orm 中,可通过 `sqlalchemy.all_()` 函数配合 `like()` 方法,安全、声明式地实现 postgresql 的 `like all (array[...])` 语义,避免使用原生 sql,同时确保所有通配符模式均被满足。
当需要查找同时匹配多个模糊条件(例如文档摘要中同时包含“par1”、“par2”和“par3”)时,PostgreSQL 原生支持 LIKE ALL (ARRAY['%par1%', '%par2%', '%par3%']),但 SQLAlchemy 默认的 ORM 查询接口不直接暴露该语法。幸运的是,SQLAlchemy 提供了 sqlalchemy.all_() 函数——它并非 Python 内置的 all(),而是专为生成 ALL 集合比较操作而设计的 SQL 表达式构造器,可与 like()、ilike() 等方法无缝协作。
✅ 正确用法如下:
from sqlalchemy import all_
# 构造 WHERE document_summary LIKE ALL (ARRAY['%par1%', '%par2%', '%par3%'])
stmt = select(OutBoxDocument).where(
OutBoxDocument.document_summary.like(all_(["%par1%", "%par2%", "%par3%"]))
)⚠️ 注意事项:
- all_() 必须与支持数组/集合比较的后端(如 PostgreSQL)配合使用;SQLite 或 MySQL 不支持 LIKE ALL,此写法在这些方言中会报错或降级为无效行为。
- 传入 all_() 的列表元素必须是完整带通配符的字符串(如 "%par1%"),不可仅传 "par1" —— 否则将执行精确匹配而非模糊匹配。
- 若需忽略大小写,应使用 ilike() 替代 like():
.where(OutBoxDocument.document_summary.ilike(all_(["%PAR1%", "%par2%", "%Par3%"])))
- 在 Flask-SQLAlchemy 中,等价写法为:
db.session.scalars(stmt).all()
? 补充说明:all_() 本质是生成 expr LIKE ALL (:param) 的参数化 SQL,完全兼容 SQLAlchemy 的安全绑定机制,有效防止 SQL 注入。它与 any_()(对应 LIKE ANY)成对存在,适用于多模式“全满足”或“任一满足”的业务场景。
综上,like(all_(...)) 是 SQLAlchemy ORM 中实现 PostgreSQL LIKE ALL 语义的标准、安全且可移植(在 PG 环境下)的解决方案,推荐在涉及多关键词共现检索的文档系统、日志分析等场景中优先采用。

















