SQLAlchemy distinct()不会通过关键字搜索返回唯一记录

时间:2015-09-01 14:50:30

标签: python database sqlalchemy flask-sqlalchemy

我有一个搜索栏,可以使用以下查询搜索用户:

db.session.query(User).filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

如您所见,它使用关键字(来自搜索查询形成的列表)进行搜索。如果我搜索“John Smith”,则搜索会找到名称中包含' John'然后是名称中包含' Smith'的同一个用户,因此它将返回用户两次。

要解决此问题,我尝试使用distinct(),如下所示:

db.session.query(User).distinct().filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

但它没有用,所以我尝试使用distinct(User.id)

db.session.query(User).distinct(User.id).filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

虽然这也不起作用。 那么问题是什么?

修改

有一点我忘了提到代码看起来像这样:

query = 'John Smith'
for keyword in query.split():
    db.session.query(User).distinct().filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

这就是它返回同一用户的2个原因。我使用for循环因为数据库还有其他字段,所以如果我搜索John Smith Mexico,它会搜索每个单词。

1 个答案:

答案 0 :(得分:0)

解决问题的一种方法是为您要搜索的所有关键字提供一个唯一查询。 (也就是说,而不是distinct,它不知道您实际上是在循环中运行查询; distinct将独立应用于每个查询,这就是为什么你得到2个结果)。

这样的事情会起作用:

In [17]:

from sqlalchemy import or_
query = 'John Smith'
keyword_c = [User.name.contains(keyword) for keyword in query] + [User.location.contains(keyword) for keyword in query]
q = session.query(User).filter(or_(*keyword_c))
for x in q.limit(16).all():
    print x.name

John Smith

希望它有所帮助。