我已经在PostgreSQL数据库中存储了包的类型:[" Clutch Bags"," Shoulder Bags"," Tote Bags"]。我正在编写一个基于python烧瓶的API端点,使用该端点,用户可以提供类似于" Red Shoulder Bag"或"灰色手拿包"。现在我想使用SQLAlchemy编写一个查询,以便对于这些给定的搜索条件,我可以在Bags表中查找该值。我写了这个,但它只有在用户输入的搜索字符串是复数时才有效,如果用户输入' Grey Clutch Bag'
categories = db.session.query(Bags.id) \
.filter(literal(search_string).ilike(func.concat('%', Bags.type, '%')))\
.all()
如何剥离尾随的'从过滤时的数据库中的包类型?我希望能够查询:
type_in_db = "Clutch Bags"
search_string = "Grey Clutch Bag"
if type_in_db.rstrip('s') in search_string:
return type_in_db
答案 0 :(得分:2)
我不是非常经验的python开发人员,但为什么不简单:
categories = db.session.query(Bags.id) \
.filter(Bags.type.like('%'+search_string+'%'))\
.all()
答案 1 :(得分:1)
“手拿包”和“灰色手拿包”无法与简单的LIKE
或“包含”相匹配。您必须重新考虑您的设计。
以下是这方面的一些想法。
在MySQL中,有一种FULLTEXT
类型的索引与“单词”一起使用。它理解英语单数/复数,因此“包”和“包”将相互匹配。但是,FULLTEXT
存在一些限制。你的一个例子可能没有击中任何一个,但其他情况可能会。
您可以“清理”输入 - 无论是构建表还是构建搜索字符串。这包括删除标点符号,复数化,大写,同义词等。
从长远来看,您可能需要避免使用第三方软件(例如SQLAlchemy);他们倾向于强迫你学习数据库及其重新制定,加上他们可能会阻止你获得一些你需要的细节。