2015-10-19 52 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

嗯案件不是問題 –