Flask專案學習(Flask專案目錄、Flask聚合函式(基本聚合函式、分組聚合函式、去重聚合函式))
阿新 • • 發佈:2021-06-11
一、Flask專案目錄 (大致是這些檔案)
--BBS --apps --各個app --forms.py(校驗元件) --models.py(模型類) --views.py(檢視函式) --static --templates --utils(自定義的檔案) --自定義的方法.py --manage.py(啟動檔案,配置一些命令列)引用create_app --config.py(配置檔案)配置資料庫引數等 --perfect_bbs.py(配置藍圖create_app) --exts.py(例項化SQLAlchemy) 下面這四個檔案互相引用的關係: config.py配置一些資料庫資訊
perfect_bbs建立藍圖使用create_app中會用到config配置檔案 manage.py啟動應用呼叫create_app,需要使用到exts.py中的SQLAlchemy例項物件
config.py的兩種寫法
方法一:(採用類的方式,配置資訊寫在類中)
import logging class Config: """專案配置""" # 資料庫地址 SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:[email protected]:3306/datas?charset=utf8" SQLALCHEMY_TRACK_MODIFICATIONS = True # 產品釋出金鑰 SECRET_KEY = "dev" # 設定日誌等級 LOG_LEVEL = logging.DEBUG class DevelopmentConfig(Config): """開發環境下的配置""" DEBUG = True class ProductionConfig(Config): """生產環境下的配置""" DEBUG = False LOG_LEVEL = logging.WARNING config = { "development": DevelopmentConfig, "production": ProductionConfig, }
二、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