【问题标题】:SQLAlchemy search using .contains() is too sensitive使用 .contains() 的 SQLAlchemy 搜索过于敏感
【发布时间】:2015-10-19 17:52:50
【问题描述】:

我有一个 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”的用户都会出现。如何搜索用户表,而不是按字母搜索,而是按单词搜索?谢谢。

【问题讨论】:

    标签: python search flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您可以在 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

    【讨论】:

    • 我添加了您的建议,我搜索了 User.name 'John' 并查询了“John”,但没有找到。
    • 也许区分大小写很重要?
    • 嗯,案件不是问题
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多