filter_by() 和 filter() 的最主要的區(qū)別: 模塊 | 語(yǔ)法 | ><(大于和小于)查詢 | and_和or_查詢 |
---|
filter_by() | 直接用屬性名,比較用= | 不支持 | 不支持 | filter() | 用類名.屬性名,比較用== | 支持 | 支持 |
談 filter_by() 的語(yǔ)法之前先看下 filter_by() 的內(nèi)部源碼,去掉注釋之后如下: def filter_by(self, **kwargs):
clauses = [_entity_descriptor(self._joinpoint_zero(), key) == value
for key, value in kwargs.items()]
return self.filter(sql.and_(*clauses)) 可以看出,filter_by() 只接受鍵值對(duì)參數(shù),所以 filter_by() 不支持><(大于和小于)和 and_、or_查詢 現(xiàn)在有 mysql 的 user 數(shù)據(jù)庫(kù)表,存儲(chǔ)內(nèi)容如下圖,下面通過(guò)例子來(lái)說(shuō)明兩種查詢方式的用法:
filter_by() 查詢 user 表里面名字等于 Tom 的: db.session.query(User).filter_by(name='Tom').all() 查詢 user 表里面名字等于 Tom 并且年齡等于 18: db.session.query(User).filter_by(name='Tom', age=18).all() 比如新的需求,查詢 user 表里面名字等于 Tom 或者年齡等于 18 的用戶,那么 filter_by() 就滿足不了要求了 filter() 查詢 user 表里面名字等于 Tom 的: db.session.query(User).filter(User.name == 'Tom').all() 查詢 user 表里面名字等于 Tom 并且年齡等于 18: db.session.query(User).filter(User.name == 'Tom', User.age == 18).all() 也可以這樣: db.session.query(User).filter(User.name == 'Tom').filter(User.age == 18).all() 如果想使用 and 拼接需要用以下方式: db.session.query(User).filter(and_(User.name == 'Tom', User.age == 18)).all() 以下的方式 and 后面的 User.age == 18 不會(huì)生效: db.session.query(User).filter(User.name == 'Tom' and User.age == 18).all() 查詢 user 表里面名字等于 Tom 的或者年齡等于 18: db.session.query(User).filter(or_(User.name == 'Tom', User.age == 18)).all() 查詢 user 表里面名字等于 Tom 的并且年齡大于 18 db.session.query(User).filter(User.name == 'Tom', User.age > 18).all() 查詢 name 中包含字母 a 的所有數(shù)據(jù)(模糊查詢) db.session.query(User).filter(User.name.like('%{0}%'.format("a"))).all() 以上的例子都是查詢中使用比較多的,使用方面看大家喜好,filter_by() 對(duì)組合查詢等等支持的不是很好,但是語(yǔ)法相對(duì) filter() 簡(jiǎn)潔一些; 另外 filter() 還有很多其他的查詢,大家可以自己去多多探討。。。
|