SQLAlchemy 查询某列包含子字符串

69 投票
5 回答
118547 浏览
提问于 2025-04-16 11:24

我正在使用SQLAlchemy和SQLite3构建一个查询,我想选择那些某个字符串列中包含特定子字符串的行。有什么好的方法可以做到这一点呢?

5 个回答

19

虽然 table.c.column.like("%...%") 这个写法是可以用的,但其实有更简单直接的方法来表达你的意思:

table.c.column.contains("needle")

这个方法通常会生成相同的SQL查询,但对于不太懂的人来说,更容易理解。需要注意的是,contains 这个方法似乎不会处理"_""%"这两个符号。

128

你可以使用 contains 操作符来进行过滤:

Model.query.filter(Model.columnName.contains('sub_string'))

如果你想要排除某些内容,可以使用 not_ 操作符:

Model.query.filter(not_(Model.columnName.contains('sub_string')))

对于不区分大小写的匹配,SQLAlchemy 2.0及以上版本提供了 icontains() 操作符(更新日志)。

55

可以通过 db.table.column.like('%needle%') 来进行筛选。还有一个 ilike 可以用来进行不区分大小写的搜索。

如果想要更高级的界面,可以使用已知的“dir”通配符。

if '*' in needle or '_' in needle: 
    looking_for = needle.replace('_', '__')\
                        .replace('*', '%')\
                        .replace('?', '_')
else:
    looking_for = '%{0}%'.format(needle)

result = db.table.filter(db.table.column.ilike(looking_for))

注意事项:

  • db.table.filterdb.table.column 是针对 SQLSoup 的(SQLSoup 在数据库是由其他应用程序创建时非常有用)
  • 对于 SQLAlchemy Core,使用的是 select(column_list).where(table.c.column.ilike(expr))。这种方式可以让你享受到原始 SQL 的强大功能,而不需要手动拼接语句(可以和 SQLSoup 一起使用,方便查看表结构,这样就不需要提前声明表)
  • 对于 SQLAlchemy Declarative(在 Flask 中使用的那种),用的是 Model.query.filter(Model.field.ilike(expr))

撰写回答