我在这里遇到一个非常具体的问题: 我需要在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
答案 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())