【问题标题】:SQLAlchemy search using varying keywords使用不同关键字的 SQLAlchemy 搜索
【发布时间】:2015-10-14 09:25:39
【问题描述】:

我在这里遇到一个非常具体的问题: 我需要在 SQLAlchemy 中进行 LIKE 搜索,但是关键字的数量是不同的。 这是一个关键字的代码:

search_query = request.form["searchinput"]
if selectet_wg and not lagernd:
    query = db_session.query(
        Artikel.Artnr,
        Artikel.Benennung,
        Artikel.Bestand,
        Artikel.Vkpreisbr1
    ).filter(
        and_(
            Artikel.Benennung.like("%"+search_query+"%"),
            Artikel.Wg == selectet_wg
        )
    ).order_by(Artikel.Vkpreisbr1.asc())

“searchinput” 看起来像这样:“property1,property2,property3”,但也可以是 1,2,5 或更多的属性。 我想将搜索输入拆分为“,”(是的,我知道该怎么做:))并为每个属性插入另一个 LIKE 搜索。 所以对于上面的例子,搜索应该是这样的:

search_query = request.form["searchinput"]
if selectet_wg and not lagernd:
    query = db_session.query(
        Artikel.Artnr,
        Artikel.Benennung,
        Artikel.Bestand,
        Artikel.Vkpreisbr1
    ).filter(
        and_(
            Artikel.Benennung.like("%"+search_query+"%"), #property1
            Artikel.Benennung.like("%"+search_query+"%"), #property2
            Artikel.Benennung.like("%"+search_query+"%"), #property3
            Artikel.Wg == selectet_wg
        )
    ).order_by(Artikel.Vkpreisbr1.asc())

我不认为仅仅为属性数量做一个 if 语句并记下查询几次是一个聪明的主意...... 我正在使用最新版本的 sqlalchemy 和 python 3.4

【问题讨论】:

    标签: python python-3.x flask sqlalchemy


    【解决方案1】:

    应该可以创建一个您喜欢的过滤器列表并将它们全部传递给and_
    首先创建一个类似查询的列表:

    search_queries = search_query.split(',')
    filter = [Artikel.Benennung.like("%"+sq"%") for sq in search_queries]
    

    然后将它们传递给and_,解包列表:

    and_(
         Artikel.Wg == selectet_wg,
         *filter
        )
    

    *filter 必须是 and_ 的最后一个参数,否则 python 会给你一个错误。

    【讨论】:

      【解决方案2】:

      您可以多次调用过滤器:

      search_query = request.form["searchinput"]
      if selectet_wg and not lagernd:
          query = db_session.query(
              Artikel.Artnr,
              Artikel.Benennung,
              Artikel.Bestand,
              Artikel.Vkpreisbr1
          ).filter(Artikel.Wg == selectet_wg)
      
          for prop in search_query.split(','):
              query = query.filter(Artikel.Benennung.like("%"+prop+"%"))
      
          query = query.order_by(Artikel.Vkpreisbr1.asc())
      

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多