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 '学生添加课程成功'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容