【问题标题】:SQLAlchemy equivalent to SQL "LIKE" statementSQLAlchemy 等价于 SQL "LIKE" 语句
【发布时间】:2010-07-24 14:31:14
【问题描述】:

标签列具有“苹果香蕉橙”和“草莓香蕉柠檬”等值。我想找到与 SQLAlchemy 等效的语句

SELECT * FROM table WHERE tags LIKE "%banana%";

我应该将什么传递给Class.query.filter() 来执行此操作?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    每一列都有like()方法,可以在query.filter()中使用。给定一个搜索字符串,在任一侧添加一个% 字符以作为子字符串双向搜索。

    tag = request.form["tag"]
    search = "%{}%".format(tag)
    posts = Post.query.filter(Post.tags.like(search)).all()
    

    【讨论】:

    • 完美!你知道有没有比添加前导空格更好的方法来区分苹果和菠萝?
    • 最好的方法是规范化你的数据库并为标签和标签到任务的关系添加 2 个单独的表,然后使用 JOIN 而不是 LIKE。否则,是的,似乎您必须在字符串中的每个标签周围使用某种分隔符。前导空间不够用,因为还有钢笔和铅笔,用%pen%。如果您执行“|apple|pineapple|pen|pencil|”之类的操作并匹配 "%|pen|%" 它不应该发生冲突。
    • 通过规范化,我不太确定如何将多个标签与给定任务关联,或者使用标签映射反之亦然。 “Toxi”解决方案似乎将标签集合分组为单个项目,而不是单独存储每个?并且这个 (elixir.ematia.de/trac/wiki/Recipes/TagCloud) 配方中使用的方法似乎只允许每个项目一个标签。什么资源最适合阐明这个主题?我也读过这个(dev.mysql.com/tech-resources/articles/…),但无法想象如何管理多个标签。
    • 正如我所说,您需要两张表。基本上,它只是典型的多对多关系,因此您可以按照 SQLAlchemy 的指南进行操作:sqlalchemy.org/docs/… 您将拥有 tags 表,其中存储标签名称和其他标签信息,并且您将拥有 task_tags 表,这将为添加到任务的每个标签创建一个记录。所以带有 2 个标签的任务在 task_tags 表中只有 2 条记录。
    【解决方案2】:

    除了上述答案之外,无论谁寻找解决方案,您也可以尝试使用“匹配”运算符而不是“喜欢”。不想有偏见,但它在 Postgresql 中非常适合我。

    Note.query.filter(Note.message.match("%somestr%")).all()
    

    它继承了CONTAINSMATCH等数据库函数。但是,它在 SQLite 中不可用。

    欲了解更多信息,请转到Common Filter Operators

    【讨论】:

    • 这两个运算符有什么区别?
    • @buhtz 取决于您的数据库后端,请参阅 SQL-Alchemy 文档:docs.sqlalchemy.org/en/14/core/… 在 Postgres 中,您会得到 to_tsquery,它可以让您为 ORAND postgresql.org/docs/current/… 等内容添加文本运算符
    • FWIW:我发现match 不完全支持部分字符串匹配(例如abc% 匹配abcd),而like 支持。
    【解决方案3】:

    试试这个代码

    output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))
    

    【讨论】:

      【解决方案4】:

      如果你想要不区分大小写的like子句实现:

      session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()
      

      【讨论】:

        【解决方案5】:

        如果你使用原生sql,可以参考我的代码,否则直接忽略我的回答。

        SELECT * FROM table WHERE tags LIKE "%banana%";
        
        from sqlalchemy import text
        
        bar_tags = "banana"
        
        # '%' attention to spaces
        query_sql = """SELECT * FROM table WHERE tags LIKE '%' :bar_tags '%'"""
        
        # db is sqlalchemy session object
        tags_res_list = db.execute(text(query_sql), {"bar_tags": bar_tags}).fetchall()
        
        

        【讨论】:

        • 非常感谢。你能解释一下LIKE '%' :bar_tags '%'syntax 吗?那是有线的。
        • 这不起作用,至少在带有 sqlite 或 postgresql+psycopg2 的 SQLA 1.4 中;带引号的 % 字符会导致语法错误。
        • 对于 sqla 1.2 也一样,不起作用。
        【解决方案6】:

        使用 PostgreSQL like (see accepted answer above) 不知何故对我不起作用虽然案例匹配,但 ilike (case insensisitive like ) 会。

        【讨论】:

        • ILIKELIKE 的不区分大小写版本,因此您的输入仅在大小写时有所不同。
        【解决方案7】:

        在 SQLAlchemy 1.4/2.0 中:

        q = session.query(User).filter(User.name.like('e%'))
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多