【问题标题】:For an SQLAlchemy query, how to combine ilike search operator with in_ operator?对于 SQLAlchemy 查询,如何将 ilike 搜索运算符与 in_ 运算符结合使用?
【发布时间】:2014-08-19 15:08:14
【问题描述】:

我正在编写接受搜索栏输入并针对我的 PostgreSQL 数据库运行查询的 SQLAlchemy 代码。为了允许拼写错误和名称片段,我有这段代码可以解决问题:

q = session.query(Detail).filter((Detail.sellers.ilike("%%%s%%" % (name_input)))).all()

现在我正在尝试做同样的事情,但要检查具有多个输入值的列表names。我已经做到了:

q = session.query(Detail).filter((Detail.sellers.in_(names))

然而,这需要完全匹配。我想结合ilike 运算符和in_ 运算符。这可能吗?我试过了:

q = session.query(Detail).filter((Detail.sellers.ilike.in_(names))

这给出了以下回溯和错误:

File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
  return self.wsgi_app(environ, start_response)
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
  response = self.make_response(self.handle_exception(e))
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
  reraise(exc_type, exc_value, tb)
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
  response = self.full_dispatch_request()
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
  rv = self.handle_user_exception(e)
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
  reraise(exc_type, exc_value, tb)
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
  rv = self.dispatch_request()
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
  return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/Tom/projects/land-records/repo/scripts/app.py", line 162, in search
  return query_db(names)
File "/Users/Tom/projects/land-records/lib/python2.7/site-packages/flask_cache/__init__.py", line 537, in decorated_function
  rv = f(*args, **kwargs)
File "/Users/Tom/projects/land-records/repo/scripts/app.py", line 106, in query_db
  q = session.query(Detail).filter((Detail.sellers.ilike.in_(names))).all()

AttributeError: 'function' object has no attribute 'in_'

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    如果只是不区分大小写的“in_”语句:

    from sqlalchemy import func
    
    q = session.query(Detail).filter(
        func.lower(Detail.sellers).in_(map(str.lower, names))
    )
    

    否则,如果您想拥有多个“ilike”语句,

    from sqlalchemy import or_
    
    conditions = []
    for name in names:
        conditions.append(Detail.sellers.ilike('%{}%'.format(name)))
    
    q = session.query(Detail).filter(
        or_(*conditions)
    )
    

    我没测试过,万一不行,我可以编辑一下。

    【讨论】:

    • 嗯,它似乎不起作用。我不熟悉func,所以我会继续玩弄它。这怎么会包括ilike
    • 对不起,我误解了这个问题。我认为这是关于不区分大小写的“in_”语句。我会编辑答案。
    • 它运行良好。非常感谢你的帮助!我只在这种情况下使用过 in_(),所以我也很高兴知道这个更强大的解决方案。对于任何对此不熟悉的人,这篇 StackOverflow 帖子还有一些附加信息:stackoverflow.com/questions/2678600/…
    • 对于第二块代码,可以定义conditions = [Detail.sellers.ilike(f'%{name}%') for name in names]等条件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多