sqlalchemy过滤多列

teg*_*ggy 57 python sql database sqlalchemy

如何组合两列并应用过滤器?例如,我想同时搜索"firstname"和"lastname"列.如果只搜索一列,我就是这样做的:

query = meta.Session.query(User).filter(User.firstname.like(searchVar))
Run Code Online (Sandbox Code Playgroud)

Dav*_*one 56

你可以简单地filter多次打电话:

query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
                                 filter(User.lastname.like(searchVar2))
Run Code Online (Sandbox Code Playgroud)

  • 在大型mysql表中使用多个`filter()`方法和在单个`filter`中使用多个条件(通过`or_`或`and_`)的组合之间是否有任何性能差异? (27认同)
  • 这将是和 (10认同)
  • 我不这么认为 - 当你看到str(User.filter(cond1).filter(cond2))生成最后的sql只有条件"和"编辑. (6认同)
  • 多个`filter`调用会像逻辑"AND"而不是"OR"吗? (4认同)

gcl*_*lj5 54

您可以使用SQLAlchemy的or_函数在多个列中进行搜索(下划线是将其与Python自己区分开来的必要条件or).

这是一个例子:

from sqlalchemy import or_
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar),
                                            User.lastname.like(searchVar)))
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`|`运算符代替`or_`,如下所示 - `(User.firstname.like(searchVar))| (User.lastname.like(searchVar))`,但是你应该小心`|`优先级,没有括号它与comparsion运算符混合时会产生非常意外的结果. (6认同)
  • 这是错误的,因为问题是关于ORM但链接导致表达. (2认同)
  • 在此之前我使用了多个过滤器语句,这极大地增加了延迟。我将其更改为 or_ 并且返回速度快得多。谢谢@gclj5 (2认同)

Vla*_*den 48

有很多方法可以做到:

使用过滤器(和运算符)

query = meta.Session.query(User).filter(
    User.firstname.like(search_var1),
    User.lastname.like(search_var2)
    )
Run Code Online (Sandbox Code Playgroud)

使用filter_by(和运算符)

query = meta.Session.query(User).filter_by(
    firstname.like(search_var1),
    lastname.like(search_var2)
    )
Run Code Online (Sandbox Code Playgroud)

链接过滤器(和运算符)

query = meta.Session.query(User).\
    filter_by(firstname.like(search_var1)).\
    filter_by(lastname.like(search_var2))
Run Code Online (Sandbox Code Playgroud)

使用or_()或and_()而不是()

from sqlalchemy import and_, or_, not_

query = meta.Session.query(User).filter(
    and_(
        User.firstname.like(search_var1),
        User.lastname.like(search_var2)
    )
)
Run Code Online (Sandbox Code Playgroud)

  • 我有点困惑。[`filter_by` 文档说](https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.filter_by) 它用于按关键字参数进行过滤:`query( Foo).filter_by(bar='baz')`。这与您在上面的答案中使用的语法有什么关系? (3认同)
  • 这些不同的方法在性能上是否存在显着差异? (2认同)
  • 大多数不同的方法最终都会生成相同的查询,因此在大多数情况下,您不会发现性能差异。 (2认同)

Azh*_*iff 6

适用于多列的通用代码。如果需要在应用程序中有条件地实现搜索功能,也可以使用此方法。

search_key = 'abc'
search_args = [col.ilike('%%%s%%' % search_key) for col in ['col1', 'col2', 'col3']]
query = Query(table).filter(or_(*search_args))
session.execute(query).fetchall()
Run Code Online (Sandbox Code Playgroud)

注意:%%跳过 % 格式化查询非常重要。