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