【发布时间】:2011-06-23 01:01:09
【问题描述】:
我正在使用 SQLAlchemy 和 SQLite3 构建一个查询,我想在其中选择 String 列包含特定子字符串的行。实现这一目标的最佳方法是什么?
【问题讨论】:
标签: python sqlite sqlalchemy
我正在使用 SQLAlchemy 和 SQLite3 构建一个查询,我想在其中选择 String 列包含特定子字符串的行。实现这一目标的最佳方法是什么?
【问题讨论】:
标签: python sqlite sqlalchemy
【讨论】:
按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 很有用)select(column_list).where(table.c.column.ilike(expr))。当您想要原始 SQL 的所有功能而无需使用字符串插值手动编写语句时,此接口是您的最佳选择(与 SQLSoup 一起使用它进行自省,因此您无需声明表)Model.query.filter(Model.field.ilike(expr))
【讨论】:
虽然table.c.column.like("%...%") 应该可以工作,但还有一种更直接的方式来表达你想要的:
table.c.column.contains("needle")
这通常会生成相同的 SQL 查询,但对于初学者来说最好阅读。 请注意, contains 似乎没有转义 "_" 和 "%"。
【讨论】:
@app.route('/<var>', methods=['GET'])
def getdb(var):
look_for = '%{0}%'.format(var)
log1 = table.query.filter(table.col.like(look_for))
我使用过 SQLAlchemy 和 Flask(顶部的 app.route 是一个装饰器)。 我使用 get API 来获取用户希望搜索的变量,并使用 format() 转换该变量以将其存储在另一个名为 look_for 的变量中(因为 var 不能直接在查询中使用)和log1 存储查询到的元组。
【讨论】: