Flask 多對(duì)多視圖查詢 模糊查詢 分頁 增刪改查


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標(biāo)簽</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 '初始化數(shù)據(jù)庫成功'


@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('查詢到所有的學(xué)生', stus)
        stus = Student.query.first()
        print('取第一個(gè)學(xué)生', stus)
        stu = Student.query.filter(Student.s_name == '豬八戒').all()[0]
        print('取名字是豬八戒的這個(gè)學(xué)生', stu)
        stu = Student.query.filter(Student.s_name == '豬八戒').first()
        print('取名字是豬八戒的這個(gè)學(xué)生', stu)
        stu = Student.query.filter_by(s_name='豬八戒').first()
        print('取名字是豬八戒的這個(gè)學(xué)生', stu)
        # django中g(shù)et(s_name='xxx'):條件必須成立,通過條件返回內(nèi)容必須唯一涣旨。
        # flask中g(shù)et(主鍵值):查詢主鍵所在行的數(shù)據(jù)對(duì)象股冗,如果不存在則返回None
        stu = Student.query.get(3)
        print('取主鍵為3的這個(gè)學(xué)生', stu)

        # order_by 排序
        # django中 Student.objects.all().order.by()
        # stus = Student.query.order_by('-id') #老版本用這種方法
        stus = Student.query.order_by(-Student.id).all()
        print('學(xué)生按照id 倒序排序', stus)

        # offset limit 分頁 從第第幾個(gè)開始取,跳過幾個(gè)開始拿值烹棉。
        page = 2
        start_page = (page - 1) * 2
        stus = Student.query.offset(start_page).limit(2).all()
        for stu in stus:
            print(stu)
        print('分頁對(duì)象分頁對(duì)象是一個(gè)列表', suts, type(stus))

        # django : Paginator(所有的結(jié)果怯疤,條數(shù))p.page(頁碼)
        # django:  p.next_page_number   p.previous_page_number
        # flask : paginate
        p = Student.query.paginate(page, 3)
        print('-----------------------------------------------')
        print('拿到分頁對(duì)象', p)

        stus = p.items
        # 上一頁,下一頁
        # 是否有下一頁: p.has_next   p.next_num
        # 是否有上一頁: p.has_prev   p.prev_num
        print('從第一開始取3個(gè), 是否有上一頁辅髓,是否有下一頁', stus, p.has_prev, p.has_next)


        # 包含       以什么開始    以什么結(jié)束   和什么一樣
        # contains/ startswith/ endwith/    like
        # django中:filter(s_name__contains='張三')
        # contains like'%張三%'  包含的意思前后都已有字符,上邊兩句表達(dá)的都是同一個(gè)意思少梁。
        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個(gè)或者多個(gè)
        print(stus)
        stus = Student.query.filter(Student.s_name.like('豬_')).all() #只能查總共兩個(gè)字的


        # 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的所有學(xué)生', 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] ^括號(hào)內(nèi)表示取反  括號(hào)外表示開頭
        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里邊的學(xué)生', stus)
        print('1111111111111111111111111111111')
        stus = Student.query.filter(Student.id.notin_([3, 4])).all()
        print('不在3妨马、4的學(xué)生有 ', stus)
        return '查詢數(shù)據(jù)成功'

    if request.method == 'POST':
        stu = Student()
        stu.s_name = '小明'
        # 事務(wù)session的add方法杀赢,其實(shí)是準(zhǔn)備插入語句湘纵,insert
        # db.session.add(stu)
        # #事務(wù)session提交了,數(shù)據(jù)才會(huì)插入到數(shù)據(jù)庫中
        # db.session.commit()
        stu.save()
        return '插入單條數(shù)據(jù)成功'

    if request.method == 'DELETE':
        stu = Student.query.filter(Student.s_name == '小明').first()
        # filter_by 刪除字段
        stu = Student.query.filter_by(s_name='孫悟空').first()
        # delete(接收刪除對(duì)象)
        db.session.delete(stu)
        db.session.commit()
        return '刪除數(shù)據(jù)成功'

    if request.method == 'PATCH':
        stu = Student.query.filter(Student.s_name == '唐僧').first()
        stu.s_age = 21
        # 修改和創(chuàng)建可以調(diào)用db.session.add() 和commit()操作
        # stu.save()
        db.session.commit()
        return '修改數(shù)據(jù)成功'


@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([添加對(duì)象1,添加對(duì)象3···])
    db.session.add_all(stus_list)
    db.session.commit()

    return '批量插入數(shù)據(jù)成功'


@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 '添加班級(jí)信息成功'


@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 = 班級(jí)對(duì)象
        # stu.grade_id_id = 班級(jí)對(duì)象的主鍵id值
        #在flask中:stu.grade_id =db.Column(ForeignKey('grade.id'))
        stu.grade_id = grade.id
        stu.save()
    return '分配班級(jí)信息成功'


@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號(hào)', grade)
    # 通過班級(jí)查看學(xué)生
    stus = grade.stus
    print('拿到這個(gè)班級(jí)有多少個(gè)學(xué)生 一對(duì)多的查詢 grade.stus', grade.stus)
    # 通過學(xué)生信息查詢班級(jí)信息
    print(stus[0].g, '通過 stus[0].g 的反查詢汇歹,查詢學(xué)生所在的班級(jí)')

    stu = stus[0]
    print(stu, '第一個(gè)學(xué)生')
    stu_grade = stu.g
    print(stu.g, '通過 stu.g 的反查詢偿凭,查詢學(xué)生所在的班級(jí)')
    return '查詢班級(jí)信息成功'


@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是一個(gè)列表', stus[0])
    print('拿到id在1,2,3中的學(xué)生', type(stus))
    print('課程', cou)
    for stu in stus:
        # 獲取學(xué)生對(duì)應(yīng)的課程信息
        print('stu.cou查看學(xué)生所選的課', stu.cou)
        # 給學(xué)生添加課程
        # stu.cou.append(cou)
        # 刪除學(xué)生課程
        # stu.cou.remove(cou)

    for stu in stus:
        # 課程添加學(xué)生  和上邊方法效果是一樣的
        print(stu)
        # cou.stus.append(stu)

    # db.session.commit()
    return '學(xué)生添加課程成功'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弯囊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子常挚,更是在濱河造成了極大的恐慌,老刑警劉巖折欠,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼过,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盗忱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門扇谣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闲昭,“玉大人,你說我怎么就攤上這事鸯绿。” “怎么了瓶蝴?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵舷手,是天一觀的道長拧簸。 經(jīng)常有香客問我聚霜,道長珠叔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任姥芥,我火速辦了婚禮汇鞭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘台囱。我一直安慰自己读整,他們只是感情好簿训,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布强品。 她就那樣靜靜地躺著屈糊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逻锐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天慷丽,我揣著相機(jī)與錄音鳄哭,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛局劲,可吹牛的內(nèi)容都是我干的奶赠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼苹丸,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼苇经!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扇单,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎施流,沒想到半個(gè)月后鄙信,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡银受,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年慎王,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖淤。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咱旱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吐限,到底是詐尸還是另有隱情,我是刑警寧澤诸典,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站舀寓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏必尼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一判莉、第九天 我趴在偏房一處隱蔽的房頂上張望育谬。 院中可真熱鬧,春花似錦渗饮、人聲如沸但汞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踩叭。三九已至,卻和暖如春自脯,著一層夾襖步出監(jiān)牢的瞬間斤富,已是汗流浹背膏潮。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工焕参, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留油额,地道東北人叠纷。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓涩嚣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親航厚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容