
在 SQLAlchemy ORM 中,可通过 sqlalchemy.all_() 函数结合 like() 实现 PostgreSQL 的 LIKE ALL 语义,避免使用原生 SQL,安全高效地匹配多个模糊条件。
在 sqlalchemy orm 中,可通过 `sqlalchemy.all_()` 函数结合 `like()` 实现 postgresql 的 `like all` 语义,避免使用原生 sql,安全高效地匹配多个模糊条件。
当需要查找同时满足多个模糊匹配条件(如 document_summary 同时包含 "par1"、"par2" 和 "par3")的记录时,PostgreSQL 原生支持 LIKE ALL (ARRAY['%par1%', '%par2%', '%par3%'])。但在严格要求使用 ORM 的项目中,直接写原生 SQL 不被允许。幸运的是,SQLAlchemy 提供了 sqlalchemy.all_() 函数——专为适配 PostgreSQL 的 ALL 集合操作而设计,可与 like() 无缝配合。
✅ 正确用法:column.like(all_(patterns))
from sqlalchemy import all_, select
from sqlalchemy.orm import Session
# 假设已定义模型 OutBoxDocument
statement = select(OutBoxDocument).where(
OutBoxDocument.document_summary.like(all_(["%par1%", "%par2%", "%par3%"]))
)
with Session(engine) as session:
results = session.scalars(statement).all()该写法生成的标准 SQL 为:
SELECT outbox_document.id, outbox_document.document_summary FROM outbox_document WHERE outbox_document.document_summary LIKE ALL (%(param_1)s)
其中 %(param_1)s 对应传递的字符串列表,由 SQLAlchemy 自动绑定并转义,完全规避 SQL 注入风险。
⚠️ 注意事项
- all_() 仅适用于 PostgreSQL(因 LIKE ALL 是其特有语法),在 SQLite/MySQL 中不可用;
- 模式字符串(如 "%par1%")需手动添加通配符,all_() 不会自动补全;
- 若使用 Flask-SQLAlchemy,替换执行方式即可:
results = db.session.scalars(statement).all() # 替代原生 Session
- all_() 接收的是 Python 列表(或元组),元素类型必须为字符串,且长度建议 ≤ 数千项(避免参数过多导致查询计划退化)。
? 替代思路(跨数据库兼容)
若未来需迁移至非 PostgreSQL 数据库,可改用链式 and_ 表达等价逻辑:
from sqlalchemy import and_ patterns = ["%par1%", "%par2%", "%par3%"] condition = and_(*[OutBoxDocument.document_summary.like(p) for p in patterns]) statement = select(OutBoxDocument).where(condition)
但注意:此方式生成 WHERE ... LIKE ? AND ... LIKE ? AND ...,语义相同,性能在大数据量下可能略低于 LIKE ALL(因无法利用某些 PG 优化器路径)。
总之,column.like(all_(...)) 是 SQLAlchemy 对 PostgreSQL LIKE ALL 最直接、最安全的 ORM 封装,推荐在明确使用 PostgreSQL 的场景中优先采用。

















