SQLAlchemy 查询某列包含子字符串
我正在使用SQLAlchemy和SQLite3构建一个查询,我想选择那些某个字符串列中包含特定子字符串的行。有什么好的方法可以做到这一点呢?
5 个回答
19
虽然 table.c.column.like("%...%")
这个写法是可以用的,但其实有更简单直接的方法来表达你的意思:
table.c.column.contains("needle")
这个方法通常会生成相同的SQL查询,但对于不太懂的人来说,更容易理解。需要注意的是,contains 这个方法似乎不会处理"_"和"%"这两个符号。
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.filter
和db.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))