SQLAlchemy子字符串过滤

时间:2016-06-21 11:46:05

标签: mysql sql postgresql sqlalchemy flask-sqlalchemy

我已经在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

2 个答案:

答案 0 :(得分:2)

我不是非常经验的python开发人员,但为什么不简单:

 categories = db.session.query(Bags.id) \
.filter(Bags.type.like('%'+search_string+'%'))\
.all()

答案 1 :(得分:1)

“手拿包”和“灰色手拿包”无法与简单的LIKE或“包含”相匹配。您必须重新考虑您的设计。

以下是这方面的一些想法。

在MySQL中,有一种FULLTEXT类型的索引与“单词”一起使用。它理解英语单数/复数,因此“包”和“包”将相互匹配。但是,FULLTEXT存在一些限制。你的一个例子可能没有击中任何一个,但其他情况可能会。

您可以“清理”输入 - 无论是构建表还是构建搜索字符串。这包括删除标点符号,复数化,大写,同义词等。

从长远来看,您可能需要避免使用第三方软件(例如SQLAlchemy);他们倾向于强迫你学习数据库及其重新制定,加上他们可能会阻止你获得一些你需要的细节。