Flask模型聚合函数
- 聚合函数
-
基本的聚合查询
- 聚合函数
form sqlalchemy import func
func中提供了所有的聚合函数
聚合函数:
sun():func.cum
count():func.count
max()
min()
avg() - 语法:
db.session.query(func.聚合函数(实体类.属性),).all()@app.route('/08-aggr') def aggregat_views(): #查询Users实体中所有人平均年龄 result = db.session.query(func.avg(Users.age)).all() print(result) return "聚合函数查询成功"
- 聚合函数
-
分组聚合查询
db.session.query(查询列,聚合列) .filter(条件) #分组前数据筛选 --- where .group_by("分组列名") #分组 --- group by .having(条件) #分组后筛选 --- having
查询Users表中年龄大于18岁的,按照isActive分组,组内人数大于2人的组名和人数查询出来
db.session.query( Users.isActive,func.count(Users.id))\ .filter(Users.age>18)\ .group_by("isActive")\ .having(func.count(Users.id) >= 2)
练习:
1.查询Users实体中年龄大于18岁的人的平均年龄
2.查询Users实体中按isActive分组后,每组的人数是多少
3.查询Users实体中按isActive分组后,组内人数大于2人的
4.查询Users标中年龄大于“QTX”的Users信息@app.route("/09-aggr-exer") def aggr_exer(): # 1.查询Users实体中年龄大于18岁的人的平均年龄 result = db.session.query(func.avg(Users.age)).filter(Users.age > 18).all() print(result) # 2.查询Users实体中按isActive分组后,每组的人数是多少 result = db.session.query(Users.isActive, func.count(Users.id)).group_by('isActive').all() print(result) # 3.查询Users实体中按isActive分组后,组内人数大于2人的组名和人数查询出来 result = db.session.query(Users.isActive,func.count(Users.id) ).group_by("isActive").having(func.count(Users.id)>2).all() print(result) #4.查询Users标中年龄大于“QTX”的Users信息 result = db.session.query(Users).filter( Users.age > db.session.query(Users.age).filter(Users.username=="QTX")).all() print(result) return "查询成功"
-
修改和删除
@app.route("/10-update")
def update_views():
#1.修改小红的isActivede的属性为True
user = db.session.query(Users).filter_by(username='小红').first()
user.isActive = True
# 2.删除姓名为小红的数据
user = db.session.query(Users).filter_by(id=4).first()
db.session.delete(user)
return "数据修改成功"
将06-users的内容添加修改和删除功能
@app.route('/11-upuser',methods=['GET','POST'])
def upuser():
if request.method == "GET":
# 1.接收id
id = request.args.get('id')
# 2.按id查询对象
user = db.session.query(Users).filter_by(id=id).first()
# print(user)
# 3.将对象发送到模板
return render_template('11-upuser.html',user=user)
else:
# 1.接收请求的参数
id = request.form['id']
# 2.查询对应的参数
user = db.session.query(Users).filter_by(id=id).first()
# 3.为对象赋值
user.username = request.form['username']
user.age = request.form['age']
user.email = request.form['email']
if 'isActive' in request.form:
user.isActive = True
else:
user.isActive = False
# 4.保存回数据库
db.session.add(user)
return redirect('/06-users')
HTML代码
11-upuser.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/11-upuser" method="post">
<p>
用户名:
<input type="text" name="username" value="{{user.username}}">
</p>
<p>
年龄:
<input type="number" name="age" value="{{user.age}}">
</p>
<p>
邮箱:
<input type="email" name="email" value="{{user.email}}">
</p>
<p>
激活:
<input type="checkbox" name="isActive"
{% if user.isActive %}
checked
{% endif %}>
<input type="hidden" name="id" value="{{user.id}}">
</p>
<p>
<button>修改</button>
</p>
</form>
</body>
</html>
基于实体类的查询
- 语法:
实体类.query.查询过滤器函数().查询执行函数() - 示例:
- 查询Users实体中所有的数据
Users.query.all() - 查询Users实体中isActive为True的数据
Users.query.filter_by(isActive = True).all()
Users.query.filter(Users.isActive==True).all()
- 查询Users实体中所有的数据