使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询

Posted

技术标签:

【中文标题】使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询【英文标题】:PostgreSQL ILIKE query with SQLAlchemy 【发布时间】:2013-12-20 06:12:51 【问题描述】:

我想运行一个查询来选择标题与'%' + [some_phrase] + '%' 匹配的所有帖子,不区分大小写。也就是说,选择所有标题包含某个短语的行,不区分大小写。从我所做的研究来看,我似乎需要使用 Postgres 的 ILIKE 查询来匹配不区分大小写的内容。如何使用 SQLAlchemy 执行这样的查询?

class Post(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(250))
    content = db.Column(db.String(5000))

【问题讨论】:

Case Insensitive Flask-SQLAlchemy Query 的可能重复项 【参考方案1】:

我觉得应该可以

Post.query.filter(Post.title.ilike('%some_phrase%'))

http://docs.sqlalchemy.org/en/latest/orm/internals.html?highlight=ilike#sqlalchemy.orm.attributes.QueryableAttribute.ilike

【讨论】:

与更受限制的 like() 函数相比,这会影响性能吗? 这取决于您使用的引擎:PostgreSQL、mysql 或其他。 SQLAlchemy 只是 SQL 的包装器。【参考方案2】:

对于 python 3.6 而不是 '%' + some_phrase + '%' 你可以写

Post.query.filter(Post.title.ilike(f'%some_phrase%'))

【讨论】:

【参考方案3】:

还有另一个可行的解决方案:

from sqlalchemy.sql.operators import ilike_op
Post.query.filter(ilike_op(Post.title, f'%some_phrase%'))

当我使用hybrid_property 时,这个解决方案帮助我克服了警告Unresolved attribute reference 'ilike' for class 'property'

【讨论】:

以上是关于使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres 上使用 sqlalchemy 创建部分唯一索引

使用 Postgres 和 SQLAlchemy 过滤数组列

Python - 使用 sqlalchemy 的 Postgres 查询返回“空数据框”

Postgres 模式的 SQLAlchemy 支持

在 postgres 中使用 sqlalchemy 访问复合数据类型

使用Postgres和SQLAlchemy过滤数组列