Flask數據的增刪改查(CRUD)


數據的查詢

all():查詢全部的數據,其結果是一個列表,每一個元素都是一個對象
    students = Student.query.all()
 
過濾查詢:
    第一種:filter,結果是baseQuery objects,
    過濾條件的格式:對象.屬性==值
    studnets = Student.query.filter(Student.id==1)
    第二種:filter_by,結果是baseQuery objects,可以進行遍歷
    students = Student.query.filter_by(id=1)
    第三種:原生sql查詢id=1的信息,結果是一個可以遍歷的對象
    sql = 'select * from student where id=1;'
    students = db.session.execute(sql)
    
模糊查詢:
    語法:filter(模型名.屬性.運算符('xx'))
    運算符:
        contains:包含
        startswith:以什么開始
        endswith:以什么結束
        in_:在范圍內
        like:模糊
        __gt__: 大於
        __ge__:大於等於
        __lt__:小於
        __le__:小於等於
        
例子:
# 模糊查詢,查詢姓名中包含小花的學生信息
# django中filter(s_name__contains='小花')
    students = Student.query.filter(Student.s_name.contains('小花'))
    
# 以什么開始
    students = Student.query.filter(Student.s_name.startswith(''))
    
 # 以什么結束
    students = Student.query.filter(Student.s_name.endswith('1'))
    
# 查詢年齡大於等於16的學生信息
    students = Student.query.filter(Student.s_age.__gt__(15))
    
# 查詢id在10到20之間的學生的學生信息
    students = Student.query.filter(Student.s_age.in_([10,11,12]))
# 查詢年齡小於17的學生信息
    Student.query.filter(Student.s_age < 17)
    students = Student.query.filter(Student.s_age.__lt__(17))
        
# 模糊查詢,使用like,查詢姓名中第二位為花的學生信息
# like '_花%',_代表必須有一個數據,%任何數據
    students = Student.query.filter(Student.s_name.like('_花%'))
        
    
篩選:
 
offset()
    # 跳過3個數據
    stus = Student.query.offset(3)
 
limit()
    # 跳過3個數據,查詢5個信息
    stus = Student.query.offset(3).limit(5)
 
order_by()
    # 按照id降序,升序
    students = Student.query.order_by('id')
    students = Student.query.order_by('-id')
 
    students = Student.query.order_by(desc('id'))
    students = Student.query.order_by(asc('id'))
 
    students = Student.query.order_by('id desc')
    students = Student.query.order_by('id asc')
 
get()
    #使用get,獲取id=1的學生對象,get()默認接收id
    # 拿不到值不會報錯,返回空
    students = Student.query.get(4)
 
first()
    # 獲取年齡最大的一個
    stus = Student.query.order_by('-s_age').first()
 
    
邏輯運算
    與
        and_
        filter(and_(條件),條件…)
    
    或
        or_
        filter(or_(條件),條件…)
    
    非
        not_
        filter(not_(條件),條件…)
 
例子:
and_  
    students = Student.query.filter(Student.s_age==16,
                                    Student.s_name.contains(''))
 
    students = Student.query.filter(and_(Student.s_age==16,
                                    Student.s_name.contains('')))
 
not_
    students = Student.query.filter(or_(Student.s_age==16,
                                    Student.s_name.contains('')))
or_
    students = Student.query.filter(not_(Student.s_age==16),
                                    Student.s_name.contains(''))
 
    
    
注意: 
1. fliter和filter_by的結果可遍歷
2. 可以通過對其結果使用all()方法將其轉換成一個列表或者first()轉換成objects對象。
3. all()獲得的是列表,列表沒有first()方法
4. fliter和filter_by有flrst()方法,沒有last方法
    

 

數據的添加

在flask中修改數據后需要添加事務和提交事務

事務: 完整,一致,持久,原子
第一種:保存數據
將數據放入緩存
db.session.add(stu)
將緩存中的數據提交
db.session.commit()

在學生表中添加數據

@blue.route('/createstu/')
def create_stu():
    s = Student()
    s.s_name = '小花'
    s.s_age = 19
 
    db.session.add(s)
    db.session.commit()
 
    return '添加成功'
    
提交事務,使用commit提交我們的添加數據的操作

批量創建數據

批量添加數據時可以使用add()、add_list()添加事務
add():
     db.session.add_all(stu)
     db.session.commit()
stu是一個對象
     
     
add_list():
    db.session.add_all(stus_list)
            db.session.commit()
stus_list是一個列表,其每個元素都是一個對象

第一種

@app_blue.route('create_many_stu/',methods=['GET'])
def create_many_stu():
if request.method == 'GET':
    stu = Student()
    stus_list = []
    for i in range(5):
        stu = Student()
        stu.s_name = '小花%s' % random.randrange(10, 1000)
        stu.s_age = random.randint(10,20)
        stus_list.append(stu)
 
    db.session.add_all(stus_list)
    db.session.commit()
        # db.session.add(stu)
    # db.session.commit
    return '批量創建'
    
db.session.add_all(stus_list)
db.session.commit()
將列表中的數據統一添加到緩存區中,並提交

 

第二種

第二種:重寫init
 
models中:
 
def __init__(self, name, age):
    # 2,給對象賦值
    self.s_name = name
    self.s_age = age
 
 
views中:
@app_blue.route('create_many_stu_init/',methods=['GET'])
def create_many_stu():
    if request.method == 'GET':
        stus_list = []
        for i in range(5):
            stu = Student('小花%s' % random.randrange(10,1000), random.randint(10,20))
            stus_list.append(stu)
 
        db.session.add_all(stus_list)
        db.session.commit()
 
            # db.session.add(stu)
        # db.session.commit
        return '批量創建成功'

 

修改數據

思路:獲取到需要修改的對象,通過對象.屬性的方式將屬性重新賦值,然后使用commit提交事務

 

寫法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()

 

刪除數據

格式:db.session.delete(對象)
     db.session.commit()
     
注意:在修改數據(增刪改)中如果使用commit()的話,只會修改本地緩存中的數據,數據庫中的數據不會更新。
必須使用:db.session.commit()

 

寫法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()

 

模型
和Django的區別:
    a. 模型中不定義數據庫的表名:
        在django中默認表名為:'應用appming_模型名小寫'
        在flask中默認的表名為:模型名的小寫
    b. 主鍵自增字段:
        django中會默認創建自增的主鍵id
        flask中需要手動創建自增的id: id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    c.查詢所有數據的結果all()
        在django結果中查詢的結果是QuerySet
        在flask中查詢結果是List
    d.查詢滿足條件的數據的結果,filter()
        在django查詢結果是QuerySet
        在flask中查詢結果是baseQuery objects

 

喜歡這篇文章?歡迎打賞~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM