SQLAlchemy 相当于 SQL“LIKE”语句

2025-04-16 08:56:00
admin
原创
24
摘要:问题描述:标签列的值包括“苹果香蕉橙子”和“草莓香蕉柠檬”。我想找到 SQLAlchemy 中与以下语句等效的语句:SELECT * FROM table WHERE tags LIKE "%banana%"; 我应该传递什么Class.query.filter()来做到这一点?解决方案 ...

问题描述:

标签列的值包括“苹果香蕉橙子”和“草莓香蕉柠檬”。我想找到 SQLAlchemy 中与以下语句等效的语句:

SELECT * FROM table WHERE tags LIKE "%banana%";

我应该传递什么Class.query.filter()来做到这一点?


解决方案 1:

每列都有like()一个方法,可以在中使用query.filter()。给定一个搜索字符串,%在两侧添加一个字符,即可在两个方向上作为子字符串进行搜索。

tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()

解决方案 2:

如果您想要不区分大小写的 like 子句实现:

session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()

解决方案 3:

除了上面的答案之外,如果有人想寻找解决方案,也可以尝试使用“match”运算符代替“like”。我无意偏袒任何人,但它在 Postgresql 中对我来说非常有效。

Note.query.filter(Note.message.match("%somestr%")).all()

它继承了数据库函数,例如CONTAINSMATCH。但是,它在 SQLite 中不可用。

更多信息请见常见过滤运算符

解决方案 4:

试试这个代码:

output = dbsession.query(<model_class>).filter(
    <model_class>.email.ilike("%" + <email> + "%")
)

解决方案 5:

除了显而易见的

select(User).where(User.name.like(f'%{some_term}%'))

SQLAlchemy 提供了一些其他生成LIKE子句的方法。

  • startswith:搜索词后跟 % 通配符

select(User.name).where(User.name.startswith('A'))
SELECT users.name 
FROM users 
WHERE (users.name LIKE :name_1 || '%')
  • endswith:搜索词前面带有 % 通配符

select(User.name).where(User.name.endswith('e'))
SELECT users.name 
FROM users 
WHERE (users.name LIKE '%' || :name_1)
  • 包含:% 通配符内的搜索词

select(User.name).where(User.name.contains('i'))
SELECT users.name 
FROM users 
WHERE (users.name LIKE '%' || :name_1 || '%')

与like和ilike方法类似,这些方法都有一个不区分大小写的对应项:istartswith、iendswith和icontains。


所有这些方法也可用于核心表列,并且也可以与旧session.query语法一起使用。

解决方案 6:

在 SQLAlchemy 1.4/2.0 中:

q = session.query(User).filter(User.name.like('e%'))

解决方案 7:

如果您使用本机 SQL,您可以参考我的代码,否则请忽略我的答案。

SELECT * FROM table WHERE tags LIKE "%banana%";
from sqlalchemy import text

bar_tags = "banana"

# '%' attention to spaces
query_sql = """SELECT * FROM table WHERE tags LIKE '%' :bar_tags '%'"""

# db is sqlalchemy session object
tags_res_list = db.execute(text(query_sql), {"bar_tags": bar_tags}).fetchall()

解决方案 8:

虽然接受的答案工作正常,但“ ORM 查询对象是 SQLAlchemy 2.0 的遗留构造”(参考:遗留查询 API - SQLAlchemy 2.0 文档)。

LIKE与使用该构造的SQL 语句对应的 SQLAlchemy v2.0 等效项select如下面的 python 3.10 代码片段所示:

from typing import List

from sqlalchemy import select
from sqlalchemy.orm import Session

...

def get_multi_like_tag_substring_bidirectional(
    db: Session,
    *,
    tags_search_substring: str,
    skip: int = 0,
    limit: int = 10,
) -> List[Post]:
    return db.scalars(
        select(Post)
        .where(Post.tags.like(f"%{tags_search_substring}%"))
        .offset(skip)
        .limit(limit)
    ).all()

...

banana_tagged_posts = get_multi_like_tag_substring_bidirectional(
    db=db_session,
    tags_search_substring = "banana"
)
    

解决方案 9:

这些年来我一直在使用的东西:

model = MyModel
col = "name_of_my_column"
value = "your-value"

query = model.query.filter(getattr(model, col).like("%{}%".format(value))).all()

解决方案 10:

使用 PostgreSQL like(参见上面接受的答案)虽然大小写匹配,但对我来说不起作用,但是ilike区分大小写却起作用。

解决方案 11:

正如您在下面看到的,我在tags列中添加了前导空格和尾随空格,以便我可以匹配由空格包围的所需标签,以确保仅匹配完整的单词,防止“pineapple”匹配“apple”或“sqlachemy”匹配“sql”:

tag = 'banana'
search = f"% {tag} %"  # !spaces around the tag
query = select(MyTable).filter((' ' + MyTable.tags + ' ').like(search))

解决方案 12:

这样做对我(Oracle)来说就像本机 SQL

"SELECT * FROM table WHERE tags LIKE '%' || :bar_tags || '%' "
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用