Flask 多对多视图查询 模糊查询 分页 增删改查


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标签

' 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 多对多视图查询 模糊查询 分页 增删改查)