from flask import Blueprint, render_template, request
from user.models import db, Student, Grade, Course
from sqlalchemy import and_, or_, not_
blue = Blueprint('app', __name__)
"""
@blue.route('/index/', methods=['GET'])
def index():
item1 = ['django', 'flask', 'tornado', 'vue', 'docker']
content_h2 = '<h2>我是h2标签</h2>'
return render_template('index.html', item1=item1, content_h2=content_h2)
"""
@blue.route('/index/', methods=['GET'])
def index():
return render_template('index.html')
@blue.route('/init_db/', methods=['GET'])
def init_db():
# 将模型映射成表 , 只能使用一次
db.create_all()
# db.drop_all() #删除所有
return '初始化数据库成功'
@blue.route('/stu6/', methods=['POST', 'DELETE', 'PATCH', 'GET'])
def stu():
if request.method == 'GET':
# flsak中all()返回的是列表
# django中all() 返回的是queryset,all().first()
stus = Student.query.all()
print('查询到所有的学生', stus)
stus = Student.query.first()
print('取第一个学生', stus)
stu = Student.query.filter(Student.s_name == '猪八戒').all()[0]
print('取名字是猪八戒的这个学生', stu)
stu = Student.query.filter(Student.s_name == '猪八戒').first()
print('取名字是猪八戒的这个学生', stu)
stu = Student.query.filter_by(s_name='猪八戒').first()
print('取名字是猪八戒的这个学生', stu)
# django中get(s_name='xxx'):条件必须成立,通过条件返回内容必须唯一。
# flask中get(主键值):查询主键所在行的数据对象,如果不存在则返回None
stu = Student.query.get(3)
print('取主键为3的这个学生', stu)
# order_by 排序
# django中 Student.objects.all().order.by()
# stus = Student.query.order_by('-id') #老版本用这种方法
stus = Student.query.order_by(-Student.id).all()
print('学生按照id 倒序排序', stus)
# offset limit 分页 从第第几个开始取,跳过几个开始拿值。
page = 2
start_page = (page - 1) * 2
stus = Student.query.offset(start_page).limit(2).all()
for stu in stus:
print(stu)
print('分页对象分页对象是一个列表', suts, type(stus))
# django : Paginator(所有的结果,条数)p.page(页码)
# django: p.next_page_number p.previous_page_number
# flask : paginate
p = Student.query.paginate(page, 3)
print('-----------------------------------------------')
print('拿到分页对象', p)
stus = p.items
# 上一页,下一页
# 是否有下一页: p.has_next p.next_num
# 是否有上一页: p.has_prev p.prev_num
print('从第一开始取3个, 是否有上一页,是否有下一页', stus, p.has_prev, p.has_next)
# 包含 以什么开始 以什么结束 和什么一样
# contains/ startswith/ endwith/ like
# django中:filter(s_name__contains='张三')
# contains like'%张三%' 包含的意思前后都已有字符,上边两句表达的都是同一个意思。
stus = Student.query.filter(Student.s_name.contains('猪八戒')).all()
print(stus)
# startswith like'猪%' '张_'
stu = Student.query.filter(Student.s_name.startswith('猪%')).all()
print(stu)
stus = Student.query.filter(Student.s_name.like('猪%')).all() #%包含0个或者多个
print(stus)
stus = Student.query.filter(Student.s_name.like('猪_')).all() #只能查总共两个字的
# gt( > ) ge( >= ) lt( < ) le( <= )
stus = Student.query.filter(Student.s_age > 18).all()
stus = Student.query.filter(Student.s_age.__gt__(18)).all()
print('年龄大于18的所有学生', stus)
#多条件查询,与或非,
# django中 fillter(Q(), Q()) fillter(Q()| Q()) fillter(~Q())
stus = Student.query.filter(Student.s_age >= 18).filter(Student.s_name.startswith('唐')).all()
print(stus)
stus = Student.query.filter(Student.s_age >=18, Student.s_name.startswith('唐')).all()
print('****************')
print(stus)
# 多条件或操作
stus = Student.query.filter(or_(Student.s_age >=18, Student.s_name.startswith('唐'))).all()
print(stus)
# 多条件 非 操作
# [^0-9a-z] ^括号内表示取反 括号外表示开头
stus = Student.query.filter(not_(Student.s_age >= 19)).all()
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print(stus)
# in notin
stus = Student.query.filter(Student.id.in_([3, 4, 6])).all()
print('在id346里边的学生', stus)
print('1111111111111111111111111111111')
stus = Student.query.filter(Student.id.notin_([3, 4])).all()
print('不在3、4的学生有 ', stus)
return '查询数据成功'
if request.method == 'POST':
stu = Student()
stu.s_name = '小明'
# 事务session的add方法,其实是准备插入语句,insert
# db.session.add(stu)
# #事务session提交了,数据才会插入到数据库中
# db.session.commit()
stu.save()
return '插入单条数据成功'
if request.method == 'DELETE':
stu = Student.query.filter(Student.s_name == '小明').first()
# filter_by 删除字段
stu = Student.query.filter_by(s_name='孙悟空').first()
# delete(接收删除对象)
db.session.delete(stu)
db.session.commit()
return '删除数据成功'
if request.method == 'PATCH':
stu = Student.query.filter(Student.s_name == '唐僧').first()
stu.s_age = 21
# 修改和创建可以调用db.session.add() 和commit()操作
# stu.save()
db.session.commit()
return '修改数据成功'
@blue.route('/stus/', methods=['GET'])
def suts():
names = ['孙悟空', '猪八戒', '唐僧', '沙和尚']
stus_list = []
for name in names:
stu = Student()
stu.s_name = name
# stu.save()也可以直接这么写
stus_list.append(stu)
# add_all([添加对象1,添加对象3···])
db.session.add_all(stus_list)
db.session.commit()
return '批量插入数据成功'
@blue.route('/add_grade/', methods=['GET'])
def add_grade():
names = ['Python班', 'Java班', 'Php班', 'Html班', 'UI班']
for name in names:
g = Grade()
g.g_name = name
db.session.add(g)
db.session.commit()
return '添加班级信息成功'
@blue.route('/stu_grade/', methods=['GET'])
def stu_grade():
stus = Student.query.filter(Student.id.in_([1, 2, 3])).all()
grade = Grade.query.filter(Grade.g_name == 'Python班').first()
for stu in stus:
# 在django中:grade_id= models.Foreignkey(Grade)
# stu.grade_id = 班级对象
# stu.grade_id_id = 班级对象的主键id值
#在flask中:stu.grade_id =db.Column(ForeignKey('grade.id'))
stu.grade_id = grade.id
stu.save()
return '分配班级信息成功'
@blue.route('/sel_stu_by_grade/', methods=['GET'])
def sel_stu_by_grade():
grade = Grade.query.filter(Grade.g_name == 'Python班').first()
print('python班的id号', grade)
# 通过班级查看学生
stus = grade.stus
print('拿到这个班级有多少个学生 一对多的查询 grade.stus', grade.stus)
# 通过学生信息查询班级信息
print(stus[0].g, '通过 stus[0].g 的反查询,查询学生所在的班级')
stu = stus[0]
print(stu, '第一个学生')
stu_grade = stu.g
print(stu.g, '通过 stu.g 的反查询,查询学生所在的班级')
return '查询班级信息成功'
@blue.route('/stu_course/', methods=['GET'])
def stu_course():
stus = Student.query.filter(Student.id.in_([1, 2, 3])).all()
cou = Course.query.filter(Course.c_name == 'JAVA').all()
print(stus)
print('stus是一个列表', stus[0])
print('拿到id在1,2,3中的学生', type(stus))
print('课程', cou)
for stu in stus:
# 获取学生对应的课程信息
print('stu.cou查看学生所选的课', stu.cou)
# 给学生添加课程
# stu.cou.append(cou)
# 删除学生课程
# stu.cou.remove(cou)
for stu in stus:
# 课程添加学生 和上边方法效果是一样的
print(stu)
# cou.stus.append(stu)
# db.session.commit()
return '学生添加课程成功'
Flask 多对多视图查询 模糊查询 分页 增删改查
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一.Springboot下JPA根据实体类自动建表(Demo使用mysql数据库,alibaba线程池)1.Mav...
- 一 创建UserMapper接口 package com.yuyi.mapper; import java.ut...
- 在iOS中,主要有5种数据缓存的策略: 1、plist 2、归档 3、偏好设置 4、沙盒文件 5、"SQLite数...