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:root@127.0.0.1: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,
}

使用配置信息方法,在perfect_

二、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
原文地址:https://www.cnblogs.com/wangcuican/p/13153813.html