2015-10-19 26 views
1

我有一个Flask应用程序,它有一个搜索栏,用户可以在其中搜索用户的数据库。这是代码:使用.contains()进行SQLAlchemy搜索太敏感了

users = [] 
for keyword in query.split(): 
    result = db.session.query(Users).filter(User.name.contains(keyword)).all() 
    for user in result: 
    users.append(user.name) 

使用上面的例子,如果我是为寻找“一”,那么每一个字母“A”在他们的名字会出现用户。我如何搜索用户表,以便通过字母搜索,而不是按字搜索?谢谢。

回答

0

您可以使用正则表达式与SQLAlchemy的:

result = db.session.query(Users).filter(User.name.op('regexp')(r'\b{}\b'.format(keyword))).all() 

\ b 匹配空字符串,但只在一个单词的开头或结尾。一个单词被定义为一个字母数字或下划线字符序列,因此单词的末尾用空格或非字母数字,非下划线字符表示。请注意,在形式上,\ b被定义为\ w和\ w字符之间的边界(反之亦然),或\ w和字符串的开始/结尾之间的边界,所以被认为是字母数字的精确字符集取决于在UNICODE和LOCALE标志的值上。例如,r'\ bfoo \ b'匹配'foo','foo。','(foo)','bar foo baz',但不匹配'foobar'或'foo3'。在字符范围内,\ b代表退格字符,以便与Python的字符串文字兼容。

https://docs.python.org/2/library/re.html

+0

我加入您的建议,我搜索了'User.name'“约翰”与“约翰”的查询,并没有找到它。 –

+0

也许区分大小写是重要的? –

+0

嗯案件不是问题 –