Flask聚合函數
1.基本聚合函數(sun/count/max/min/avg)
使用聚合函數先導入:from sqlalchemy import func 使用方法: sun():func.sum count():func.count max() min() avg()
語法 注意:使用db.session.query()括號內必須要寫東西,不能空着,不然都不知道從哪張表中查詢數據
from sqlalchemy import func
db.session.query(func.聚合函數(實體類.屬性)).all()
代碼示例:
@app.route('/08-aggr')
def aggregat_views():
#查詢Users實體中所有人平均年齡
result = db.session.query(func.avg(Users.age)).all()
return "聚合函數查詢成功"
2.分組聚合查詢 group_by
db.session.query(查詢列,聚合列) ---query括號內的數據是查詢最后展示的數據,列表套元組格式
.filter(條件) #分組前數據篩選 --- where filter括號內放的是查詢的條件
.group_by("分組列名") #分組 --- group by group_by括號內放的是根據分組的列名
.having(條件) #分組后篩選 --- having having括號內也是放篩選條件,不過需要在分組之后才能使用
查詢Users表中年齡大於18歲的,按照isActive分組,組內人數大於2人的組名和人數查詢出來
db.session.query(
Users.isActive,func.count(Users.id))\ #----查詢結果顯示的數據字段:isActive,Users.id的聚合函數求和
.filter(Users.age>18)\ #篩選出年齡大於18的
.group_by("isActive")\ #根據isActive分組
.having(func.count(Users.id) >= 2) #分組之后再做篩選
分組統計數量 (展示分組的label_name,數量)
dbS.session.query(Label.label_name, func.count(Label.id)).filter(Label.ta == ta).group_by("label_name").limit(50).all()
練習
1.查詢Users實體中年齡大於18歲的人的平均年齡 2.查詢Users實體中按isActive分組后,每組的人數是多少 3.查詢Users實體中按isActive分組后,組內人數大於2人的 4.查詢Users標中年齡大於“QTX”的Users信息
#先filter篩選出age大於18的,然后使用func.avg求平均年齡
1.db.session.query(func.avg(Users.age)).filter(Users.age>18).all()
#先根據isActive分組,使用func.count算出分組后每組的數量,結果是列表套元組[(isActive,數量)]
2.db.session.query(Users.isActive,func.count(Users.id)).group_by('isActive').all()
3.db.session.query(Users.isActive,func.count(Users.id)).group_by('isActive').having(func.count(Users.id>2)).all()
#子查詢
4.db.session.query(Users).filter(Users.age>db.session.query(Users.age).filter(Users.username=="QTX")).all()
3.去重聚合函數 distinct
from sqlalchemy import distinct #去重后的標簽名 labels=dbS.session.query(distinct(Label.label_name)).all() #去重后的標簽數量 label_distinct=dbS.session.query(func.count(distinct(Label.label_name))).all()
4.聚合函數的修改和刪除
#1.修改小紅的isActive的屬性為True #先查詢出需要修改的對象,然后修改屬性 user=db.session.query(Users).filter_by(username='小紅').first() user.isActive=True #2.刪除姓名為小紅的數據 user=db.session.query(Users).filter_by(username='小紅').first() db.session.delete(user)
5.基於實體類的查詢
1.語法:實體類.query.查詢過濾器函數().查詢執行函數()
2.示例:
1.查詢Users實體中所有的數據 users.query.all() 2.查詢Users實體中isActive為True的數據 Users.query.filter_by(isActive=True).all() Users.query.filter(Users.isActive==True).all()
比較db.session和實體類的查詢不同點
#基於實體類查詢 post_obj=Post.query.filter(Post.id==1).first() #db.session查詢方式 post_test=db.session.query(Post.id,Post.title).filter(Post.id==1).first()
注意:db.session方式查詢query中必須要寫東西,因為要從query中獲取從哪張表中查詢
如果查詢是多個結果就是列表套元組:[(id1,title1),(id2,title2),....]
db.session.query(模型類) 等價於 模型類.query ,db.session.query的功能更強大,可以進行多表查詢
from sqlalchemy import func
