SQLAlchemy使用不同的关键字进行搜索

时间:2015-10-14 09:25:40

标签: python python-3.x flask sqlalchemy

我在这里遇到一个非常具体的问题: 我需要在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或更多属性。 我想将searchinput拆分为“,”(是的,我知道该怎么做:))并为每个属性插入另一个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

2 个答案:

答案 0 :(得分:3)

应该可以创建一个类似过滤器的列表,并将它们全部传递给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会给你一个错误。

答案 1 :(得分: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())