Day18-flask3

1. 對(duì)學(xué)生數(shù)據(jù)進(jìn)行CRUD操作

語(yǔ)法:

類名.query.xxx

獲取查詢集:

all()

filter(類名.屬性名==xxx)

filter_by(屬性名=xxx)

數(shù)據(jù)操作:

在事務(wù)中處理,數(shù)據(jù)插入

db.session.add(object)

db.session.add_all(list[object])

db.session.delete(object)

db.session.commit()

修改和刪除基于查詢

1.1 想學(xué)生表中添加數(shù)據(jù)

@blue.route('/createstu/')
def create_stu():

    s = Student()
    s.s_name = '小花%d' % random.randrange(100)
    s.s_age = '%d' % random.randrange(30)

    db.session.add(s)
    db.session.commit()

    return '添加成功'

提交事務(wù),使用commit提交我們的添加數(shù)據(jù)的操作

1.2 獲取所有學(xué)生信息

將學(xué)生的全部信息獲取到,并且返回給頁(yè)面,在頁(yè)面中使用for循環(huán)去解析即可

@blue.route("/getstudents/")
def get_students():
    students = Student.query.all()
    return render_template("StudentList.html", students=students)

1.3 獲取s_id=1的學(xué)生的信息

寫法1:

students = Student.query.filter(Student.s_id==1)

寫法2:

students = Student.query.filter_by(s_id=2)

注意:filter中可以接多個(gè)過濾條件

寫法3:

sql = 'select * from student where s_id=1'
students = db.session.execute(sql)

1.4 修改學(xué)生的信息

寫法1:

students = Student.query.filter_by(s_id=3).first()
students.s_name = '哈哈'
db.session.commit()

寫法2:

Student.query.filter_by(s_id=3).update({'s_name':'娃哈哈'})

db.session.commit()

1.5 刪除一個(gè)學(xué)生的信息

寫法1:

students = Student.query.filter_by(s_id=2).first()
db.session.delete(students)
db.session.commit()

寫法2:

students = Student.query.filter_by(s_id=1).all()
db.session.delete(students[0])
db.session.commit()

注意:filter_by后的結(jié)果是一個(gè)list的結(jié)果集

重點(diǎn)注意:在增刪改中如果不commit的話,數(shù)據(jù)庫(kù)中的數(shù)據(jù)并不會(huì)更新,只會(huì)修改本地緩存中的數(shù)據(jù),所以一定需要db.session.commit()

2. 深入數(shù)據(jù)庫(kù)增刪改查

定義模型,并定義初始化的函數(shù):

class Student(db.Model):

    s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(16), unique=True)
    s_age = db.Column(db.Integer, default=1)

    __tablename__ = "student"

    def __init__(self, name, age):
        self.s_name = name
        self.s_age = age

2.1 增--批量增加

第一種方式:

@blue.route('/createstus/')
def create_users():
    stus = []
    for i in range(5):
        # 實(shí)例化Student的對(duì)象
        s = Student()
        # 對(duì)象的屬性賦值
        s.s_name = '張三%s' % random.randrange(10000)
        s.s_age = '%d' % random.randrange(100)
        stus.append(s)
    # 添加需要?jiǎng)?chuàng)建的數(shù)據(jù)
    db.session.add_all(stus)
    # 提交事務(wù)到數(shù)據(jù)庫(kù)
    db.session.commit()

    return '創(chuàng)建成功'

注:在創(chuàng)建單條數(shù)據(jù)的時(shí)候使用db.session.add(),在創(chuàng)建多條數(shù)據(jù)的時(shí)候使用db.session.add_all()

第二種方式:

@blue.route('/createstus/')
def create_users():
    stus = []
    for i in range(5):
        # 使用類的初始化去創(chuàng)建Student對(duì)象
        s = Student('張三%s' % random.randrange(10000),
                    '%d' % random.randrange(100))
        stus.append(s)

    db.session.add_all(stus)
    db.session.commit()

    return '創(chuàng)建成功'

2.2 查--使用運(yùn)算符

獲取查詢集

filter(類名.屬性名.運(yùn)算符(‘xxx’))

filter(類名.屬性 數(shù)學(xué)運(yùn)算符  值)

運(yùn)算符:

contains: 包含
startswith:以什么開始
endswith:以什么結(jié)束
in_:在范圍內(nèi)
like:模糊
__gt__: 大于
__ge__:大于等于
__lt__:小于
__le__:小于等于

邏輯運(yùn)算:

與
    and_
    filter(and_(條件),條件…)

或
    or_
    filter(or_(條件),條件…)

非
    not_
    filter(not_(條件),條件…)

例子1:

  1. 查詢學(xué)生的id為3,4,5,6,16的的學(xué)生信息,使用in_邏輯運(yùn)算

     @blue.route('/getstubyids/')
     def get_stu_by_ids():
    
        students = Student.query.filter(Student.s_id.in_([3,4,5,6,16]))
        return render_template('StudentList.html', students=students)
    
    
  2. 查詢學(xué)生的年齡小于18歲的學(xué)生的信息

     Student.query.filter(Student.s_age < 18)
    
    
  3. 查詢學(xué)生的年齡小于18歲的學(xué)生的信息,lt小于

     students = Student.query.filter(Student.s_age.__lt__(15))
    
    
  4. 查詢學(xué)生的年齡小于等于18歲的學(xué)生的信息,le小于等于

     students = Student.query.filter(Student.s_age.__le__(15))
    
    
  5. 查詢學(xué)生的姓名以什么開始或者以什么結(jié)尾的學(xué)生的信息startswith和endswith

     students = Student.query.filter(Student.s_name.startswith('張'))
     students = Student.query.filter(Student.s_name.endswith('2'))
    
    
  6. 查詢id=4的學(xué)生的信息

     Student.query.get(4)
     獲取的結(jié)果是學(xué)生的對(duì)象
    
    
  7. 模糊搜索like

     %:代表一個(gè)或者多個(gè)
     _:代表一個(gè)
    
     Student.query.filter(Student.s_name.like('%張%')) 
    
    

例子:

查詢

from sqlalchemy import and_, or_, not_

查詢多個(gè)條件

stus = Student.query.filter(Student.s_age==18, Student.s_name=='雅典娜')

and_ 并且條件

stus = Student.query.filter(and_(Student.s_age==18, Student.s_name=='雅典娜'))

or_ 或者條件

stus = Student.query.filter(or_(Student.s_age==18, Student.s_name=='火神'))

not_ 非

stus = Student.query.filter(not_(Student.s_age==18), Student.s_name=='火神')

查詢姓名不包含'可愛‘,并且年齡不等于12的學(xué)生

stus = Student.query.filter(not_(Student.s_name.contains('可愛')), not_(Student.s_age == 12))

manage.py

import redis
from flask import Flask
from flask_script import Manager
from flask_session import Session

from users.models import db
from users.views import uesrs_blue

app=Flask(__name__)
# 藍(lán)圖、設(shè)置前綴
app.register_blueprint(blueprint=uesrs_blue,url_prefix='/users')

# 設(shè)置秘鑰
app.config['SECRET_KEY']='123'
# 數(shù)據(jù)庫(kù)設(shè)置

app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/flask5'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False

# 綁定數(shù)據(jù)庫(kù)
db.init_app(app)

# manager
manager=Manager(app=app)

if __name__=='__main__':
    manager.run()

users->views.py

from flask import Blueprint, render_template, request, redirect, url_for
from sqlalchemy import or_, not_

from users.models import Students, db

uesrs_blue=Blueprint('users',__name__)


# @uesrs_blue.route('/register/',methods=['GET','POST'])
# def register():
#     if request.method=='GET':
#         return render_template('register.html')
#     if request.method=='POST':
#         pass
@uesrs_blue.route('/create_table/')
def create_table():
    # 用于初次創(chuàng)建模型
    db.create_all()
    return "創(chuàng)建成功"


@uesrs_blue.route('/drop_table/')
def drop_table():
    db.drop_all()
    return "刪除成功"


@uesrs_blue.route('/add_students/',methods=['GET','POST'])
def add_students():
    if request.method=='GET':
        return render_template('students.html')
    if request.method=='POST':
        name=request.form.get('name')
        age=int(request.form.get('age'))
        # 單個(gè)創(chuàng)建
        stu=Students()
        stu.s_name=name
        stu.s_age=age
        stu.save()
        return '添加學(xué)生成功'


@uesrs_blue.route('/add_all_students/')
def add_all_students():
    # 批量創(chuàng)建 add_all()
    names=['小王','小圖','小坑','小進(jìn)','老金','小人','小建','小國(guó)','老劉']
    stu_list=[]
    for name in names:
        stu=Students()
        stu.s_name=name
        stu_list.append(stu)
    db.session.add_all(stu_list)
    db.session.commit()
    return '批量創(chuàng)建成功'


@uesrs_blue.route('/select_students/')
def select_students():
    # 方法一:
    stu=Students.query.filter(Students.s_name=='小王')
    stu=Students.query.filter(Students.s_name=='小建').first()

    # 方法二:
    stu=Students.query.filter_by(s_name='老劉')
    stu=Students.query.filter_by(s_name='老劉').first()

    # 方法三:
    stus=Students.query.all()

    # 方法四:
    sql='select * from students;'
    stu=db.session.execute(sql)

    # 模糊查詢
    # select * from students where s_name like '%王%'
    # select * from students where s_name like '王%'
    # select * from students where s_name like '_王%'  第二位為王
    # select * from students where s_name like '%王'
    stu=Students.query.filter(Students.s_name.contains('小'))
    stu=Students.query.filter(Students.s_name.startswith('小'))
    stu=Students.query.filter(Students.s_name.endswith('王'))

    # 查詢id在某個(gè)范圍之內(nèi)的學(xué)生信息
    # select * from students where id in (2,3,4,5,6)
    stu=Students.query.filter(Students.id.in_([2,3,4,5,6]))

    # 運(yùn)算符查詢
    # 查詢年齡大于19的學(xué)生信息
    stu=Students.query.filter(Students.s_age>19)
    stu=Students.query.filter(Students.s_age.__gt__(19))

    # get方法,獲取主鍵對(duì)應(yīng)的行數(shù)據(jù)
    stu=Students.query.get(2)

    # offset+limit
    stu=Students.query.limit(3)
    stu=Students.query.offset(1).limit(3)

    # 排序order_by
    stu=Students.query.order_by('-id')

    # 查詢姓名中包含王的,并且年齡等于23
    stu=Students.query.filter(Students.s_name.contains('王'),
                              Students.s_age==19)
    # 查詢姓名中包含王的,或年齡等于23
    # Django中:filter(Q(A)|Q(B))
    # flask中:filter(or_(A,B))
    stu=Students.query.filter(or_(Students.s_name.like('%王%'),
                              Students.s_age==19))
    # 查詢姓名中不包含王的,且年齡等于23
    stu = Students.query.filter(not_(Students.s_name.like('%王%')),
                                    Students.s_age == 19)



    return render_template('select_students.html',stus=stus)


@uesrs_blue.route('/delete_stu/<int:id>')
def delete_stu(id):
    stu=Students.query.filter(Students.id==id).first()
    db.session.delete(stu)
    db.session.commit()
    return '刪除成功'


@uesrs_blue.route('/update_stu/<int:id>',methods=['GET','POST'])
def update_stu(id):
    if request.method=='GET':
        return render_template('update_stu.html')
    if request.method=='POST':
        name=request.form.get('name')
        age=int(request.form.get('age'))
        stu=Students.query.filter_by(id=id).first()
        if name:
            stu.s_name=name
        if age:
            stu.s_age=age
        stu.save()
        return redirect(url_for('users.select_students'))


users->models.py

from flask_sqlalchemy import SQLAlchemy


db=SQLAlchemy()


class Students(db.Model):
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    s_name=db.Column(db.String(10),unique=False,nullable=False)
    s_age=db.Column(db.Integer,default=19)

    __tablename__='students'


    def save(self):
        db.session.add(self)
        db.session.commit()

templates->base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% block title %}
        {% endblock %}
    </title>

    {% block css %}
    {% endblock %}

    {% block js %}
    {% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>

template->base_main.html

{% extends 'base.html' %}
{% block js %}
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"type="text/javascript"></script>
{% endblock %}

template->register.html

{% extends 'base_main.html' %}
{% block title %}
    查詢學(xué)生
{% endblock %}
{% block content %}
<table>
    <thead>
        <th>序號(hào)</th>
        <th>id</th>
        <th>姓名</th>
        <th>年齡</th>
        <th>操作</th>
    </thead>
    <tbody>
        {% for stu in stus %}
        <tr>
            <td>{{loop.index0}}</td>
            <td>{{stu.id}}</td>
            <td>{{stu.s_name}}</td>
            <td>{{stu.s_age}}</td>
            <td><a >修改</a>|<a >刪除</a></td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

template->students.html

{% extends 'base_main.html' %}
{% block title %}
    添加學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
    姓名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    <input type="submit" value="添加學(xué)生">
</form>
{% endblock %}


template->update_stu.html

{% extends 'base_main.html' %}
{% block title %}
    修改學(xué)生
{% endblock %}
{% block content %}
<form action="" method="post">
    姓名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    <input type="submit" value="修改學(xué)生信息">
</form>
{% endblock %}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,042評(píng)論 2 59
  • 擔(dān)當(dāng),當(dāng)事情來(lái)臨時(shí)挺起胸膛來(lái)?yè)肀虑?,這樣才會(huì)具有主動(dòng)權(quán)。傾財(cái)足以聚人,量寬足以得人,律己足以服人,身先足以率人。...
    若水向善閱讀 485評(píng)論 0 0
  • 感覺更新很累,但是又要堅(jiān)持。 昨天到然烏,經(jīng)歷大半天的雨騎,而且然烏這個(gè)地方怎么說呢?雖然有個(gè)然烏湖旅游景區(qū),但是...
    低調(diào)zb閱讀 702評(píng)論 0 2
  • 如果不熟悉 Tabs,也可以去ionicframework官網(wǎng)了解一下。 一、底部tab切換,默認(rèn)選中第二個(gè) ht...
    猿奇閱讀 2,145評(píng)論 1 1
  • 從小到大,我就沒有被女孩欣賞過。雖然我知道我長(zhǎng)得帥、有才華、有氣質(zhì),但是好像別人認(rèn)為的都跟我認(rèn)為的不一樣。從小到大...
    連接一切閱讀 321評(píng)論 0 0

友情鏈接更多精彩內(nèi)容