1. 程式人生 > 其它 >Flask專案學習(Flask專案目錄、Flask聚合函式(基本聚合函式、分組聚合函式、去重聚合函式))

Flask專案學習(Flask專案目錄、Flask聚合函式(基本聚合函式、分組聚合函式、去重聚合函式))

一、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