SQLAlchemy查询列包含子字符串的位置

时间:2011-02-07 21:22:31

标签: python sqlite sqlalchemy

我正在使用SQLAlchemy和SQLite3构建一个查询,我想在其中选择一个String列包含特定子字符串的行。完成此任务的最佳方法是什么?

4 个答案:

答案 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.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))

答案 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存储查询的元组。