【问题标题】:SQLAlchemy query where a column contains a substring列包含子字符串的 SQLAlchemy 查询
【发布时间】:2011-06-23 01:01:09
【问题描述】:

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

【问题讨论】:

    标签: python sqlite sqlalchemy


    【解决方案1】:

    您可以使用contains 运算符进行过滤:

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

    要取反,请使用not_ 运算符:

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

    【讨论】:

    • 感谢您的回答。你解决了我的问题。但是你能详细介绍一下这个功能吗?我想知道它是如何工作的。
    • @Wally 刚刚重新访问了这个没有太大帮助的评论 - 抱歉。这个更好sqlalchemy.orm.attributes.QueryableAttribute.contains
    • Bluehorn 的回答进一步说明了问题,但我遇到了 like(%...%) 有效但 contains() 根本无效的情况。还不知道为什么。
    【解决方案2】:

    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 声明式(Flask 中使用的那个)它是Model.query.filter(Model.field.ilike(expr))

    【讨论】:

    • 你能告诉我们Flask-SQLAlchemy中的查询吗
    • @Wally Flask-SQLAlchemy 是一个将 SQLAlchemy 连接到 Flask 的便捷包。与 SQLAlchemy 声明式相比,查询不会改变。
    【解决方案3】:

    虽然table.c.column.like("%...%") 应该可以工作,但还有一种更直接的方式来表达你想要的:

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

    这通常会生成相同的 SQL 查询,但对于初学者来说最好阅读。 请注意, contains 似乎没有转义 "_""%"

    【讨论】:

    • like(%...%) 没有那么直接,不 - 但我有一组表(模型)将 field.contains(k) 转换为字段 LIKE '%%' | | ķ || '%%' 每次 - 没有呈现正确的结果。
    【解决方案4】:
    @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 存储查询到的元组。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2015-04-19
      相关资源
      最近更新 更多