filter_by() 和 filter() 的最主要的區別:
模塊 | 語法 | ><(大于和小于)查詢 | and_和or_查詢 |
---|---|---|---|
filter_by() | 直接用屬性名,比較用= | 不支持 | 不支持 |
filter() | 用類名.屬性名,比較用== | 支持 | 支持 |
談 filter_by() 的語法之前先看下 filter_by() 的內部源碼,去掉注釋之后如下:
def filter_by(self, **kwargs):clauses = [_entity_descriptor(self._joinpoint_zero(), key) == valuefor key, value in kwargs.items()]return self.filter(sql.and_(*clauses))
可以看出,filter_by() 只接受鍵值對參數,所以 filter_by() 不支持><(大于和小于)和 and_、or_查詢
?
user表
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 不會生效:
???????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 的所有數據(模糊查詢)
???????db.session.query(User).filter(User.name.like('%{0}%'.format("a"))).all()
以上的例子都是查詢中使用比較多的,使用方面看大家喜好,filter_by() 對組合查詢等等支持的不是很好,但是語法相對 filter() 簡潔一些; 另外 filter() 還有很多其他的查詢,大家可以自己去多多探討。。。
筆記:
?
?
現在有 mysql 的 user 數據庫表,存儲內容如下圖,下面通過例子來說明兩種查詢方式的用法:
在一個用戶的模型類中, 要查詢id為5的一個用戶;
User.query.filter(User.id==5).all() ?# ?使用filter 中必須指定那個 模型類.id==5;?
User.query.filter(User.id==5).first() ?#?all() , first() ,都是查詢執行器 , 一個返回列表包含對象, 一個直接返回對象;
User.query.filter_by(id=5).first() ?#?filter_by默認就是使用id ?進行查詢 , 寫法為id=5; 不可以使用==; 也不用模型類.id的方式; 它是一種更加精確的查詢;
?
?
# users = User.query.filter_by(isdelete=False).all()? ? ? ? 用等值符號
# users = User.query.filter(User.isdelete == False,
? ? ? ? ? ? ? ? ? ?User.phone.startswith('150')).order_by(-User.rdatetime)? 用關系符號 升序降序正負號
users = User.query.filter(or_(User.username==search,?User.phone == search)).all()? # select * from user where username=search or phone=search
number = User.query.filter(or_(User.username==search,User.phone == search)).count()
users = User.query.filter(or_(User.username.like('%' + search + '%'), User.phone == search)).all()? #返回的是列表
number = User.query.filter(or_(User.username.like(search), User.phone == search)).count()? ?
???
?
<a href="javascript:0;" onclick="del({{user.id}})">刪除</a> 跳過hrf 執行js腳本