我正在使用SQLAlchemy和SQLite3构建一个查询,我想在其中选择一个String列包含特定子字符串的行。完成此任务的最佳方法是什么?
答案 0 :(得分:55)
试试这个
Model.query.filter(Model.columnName.contains('sub_string'))
答案 1 :(得分:27)
按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))
答案 2 :(得分:11)
虽然table.c.column.like("%...%")
应该有用,但有一种更直接的方式可以说出你想要的内容:
table.c.column.contains("needle")
这通常会生成相同的SQL查询,但最好是为未初始化的人阅读。 请注意,包含似乎不会逃避“_”和“%”。
答案 3 :(得分:1)
@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来接收用户希望搜索的变量,并且我正在转换该变量以将其存储在另一个名为look_for的变量中(因为var不能直接在查询中使用),使用format()和log1存储查询的元组。