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>我是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 '学生添加课程成功'
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容