• 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
  • 相关阅读:
    Python函数式编程学习笔记
    DOS常用命令总结
    Python高级特性学习笔记
    Git bash使用中...
    《零基础入门学习Python》学习过程笔记【30模块中的函数,os模块,ospath模块中的函数(看了一点)】
    这两天将这段时间的python笔记常用知识复习了一遍...前天半夜吃了盘烤羊肉..得了急性肠炎
    《零基础入门学习Python》学习过程笔记【29对文件进行分割】(没看)
    《零基础入门学习Python》学习过程笔记【28文件】
    《零基础入门学习Python》学习过程笔记【27集合】
    用python写一个简单的用户登陆程序(要求写成函数)
  • 原文地址:https://www.cnblogs.com/wangcuican/p/13153813.html
Copyright © 2020-2023  润新知