SQLAlchemy中.filter()与.where()的区别及两种写法存在原因
SQLAlchemy里filter()和where()的区别,以及为啥有两种写法
两者的核心区别
- 出身和适用场景:
filter()是SQLAlchemy从一开始就有的老方法,ORM和Core(核心SQL表达式)场景都能用;where()是1.4版本之后才加的新方法,主要是为了让查询写法更贴近原生SQL的感觉,对齐SQL表达式的风格。 - 写法细节差异:
filter()更偏向ORM风格,一般用模型类属性的比较表达式,比如models.Post.owner_id == user.id,还能直接用ORM自带的查询方法,比如filter(models.Post.title.like("%sql%"))。where()除了支持filter()的所有写法,还能直接传原生SQL文本(配合text()函数),比如where(text("owner_id = :user_id"), user_id=user.id),写法和原生SQL的WHERE子句几乎一致。
- 链式调用的不同表现:
多次调用filter()会自动用AND把多个条件拼起来,比如db.query(models.Post).filter(...).filter(...)就相当于两个条件同时满足;但在Core的select()语句里,多次调用where()会替换掉之前的WHERE条件(不过ORM的Query对象里,where()和filter()行为一样,都是追加条件),这点要根据使用场景注意。
为啥会有两种写法?
其实就是为了照顾不同开发者的习惯和需求:
- 老项目或者习惯用ORM面向对象写法的人,更爱用
filter(),它和SQLAlchemy早期的API兼容得更好,操作模型也更顺手。 - 习惯写原生SQL、或者需要更灵活控制SQL表达式的人,会更喜欢
where(),它的语法更直观,和原生SQL的对应关系更强,用起来更自由。 - SQLAlchemy在版本更新时,一直想平衡ORM的便捷性和原生SQL的灵活性,加
where()就是为了覆盖更多用户的使用偏好,同时让Core和ORM的查询语法更统一。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

