Python中使用SQLAlchemy查询时,filter_by和filter有什么区别?filter不支持组合查询是真的吗?

filter(a == a and b==b)
我搜了下有人说 and 后面的不生效但是也不报错,需要连续的 filter,请大佬来指点下这是真的吗?
Python中使用SQLAlchemy查询时,filter_by和filter有什么区别?filter不支持组合查询是真的吗?

8 回复

对,这样是不生效的。可以 filter(a==a, b==b) 或 filter(and_(a==a, b==b))


filter_byfilter 都是 SQLAlchemy ORM 中常用的查询方法,但用法和灵活性有本质区别。

1. filter_by:

  • 使用关键字参数,参数名直接对应模型类的属性名。
  • 只能进行等值比较(=)。
  • 适合简单的、基于属性名的等值查询。
  • 示例:
    session.query(User).filter_by(name='Alice', age=30).all()
    

2. filter:

  • 使用 Python 表达式或 SQLAlchemy 的列表达式,参数更灵活。
  • 支持所有 SQL 比较操作(==, !=, >, <, like, in_ 等)。
  • 支持复杂的组合查询(通过 and_(), or_(), not_() 或直接使用 &, |, ~ 运算符)。
  • 示例:
    from sqlalchemy import and_, or_
    
    # 使用 and_ 组合
    session.query(User).filter(and_(User.name == 'Alice', User.age > 25)).all()
    
    # 直接使用 & 运算符(注意括号)
    session.query(User).filter((User.name == 'Alice') & (User.age > 25)).all()
    
    # 链式调用 filter 实现 AND
    session.query(User).filter(User.name == 'Alice').filter(User.age > 25).all()
    
    # 使用 or_
    session.query(User).filter(or_(User.name == 'Alice', User.age < 20)).all()
    

关于“filter不支持组合查询”的说法: 这是错误的。 filter 完全支持组合查询,可以通过 and_()or_() 等函数或直接使用 Python 的位运算符(&, |, ~)来构建复杂的查询条件。filter_by 才不支持组合查询,它只能进行简单的等值匹配。

总结: 需要灵活条件或组合查询时,无脑用 filter 就对了。

其实自己试试就知道了

学习了,以前用了 and 没报错我以为没问题呢,现在看来要改一下了

我一般是简单的用 filter_by,filter_by 处理不了的用 filter。至于结果如何,可以配置日志看看生成的 SQL 语句。
http://docs.sqlalchemy.org/en/latest/core/engines.html#configuring-logging



另 我们似曾相识?

美味书签的同事?

对对对

因为 python 不允许重载 and 运算符,所以只能曲线救国了

回到顶部