Python 使用.contains()的SQLAlchemy搜索太敏感

Python 使用.contains()的SQLAlchemy搜索太敏感,python,search,flask,sqlalchemy,flask-sqlalchemy,Python,Search,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个Flask应用程序,它有一个搜索栏,用户可以在其中搜索数据库中的用户。代码如下: 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”,那么每个名字中都会出现字母“a”的用

我有一个Flask应用程序,它有一个搜索栏,用户可以在其中搜索数据库中的用户。代码如下:

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”,那么每个名字中都会出现字母“a”的用户。如何搜索用户表,使其不按字母搜索,而是按单词搜索?谢谢。

您可以将正则表达式与SQLAlchemy一起使用:

result = db.session.query(Users).filter(User.name.op('regexp')(r'\b{}\b'.format(keyword))).all()
\b 匹配空字符串,但仅在单词的开头或结尾处匹配。单词定义为字母数字或下划线字符序列,因此单词的结尾由空格或非字母数字、非下划线字符表示。请注意,形式上,\b定义为\w和\w字符之间的边界(反之亦然),或\w和字符串的开头/结尾之间的边界,因此被视为字母数字的精确字符集取决于UNICODE和区域设置标志的值。例如,r'\bfoo\b'匹配'foo','foo','(foo)','bar foo baz',但不匹配'foobar'或'foo3'。在字符范围内,\b表示退格字符,以便与Python的字符串文字兼容


我添加了您的建议,并搜索了一个
用户名
“John”和一个“John”的查询,但没有找到。可能大小写敏感很重要?嗯,案例不是问题所在