flask-sqlalchemy 對數據庫增刪改查

接着上一篇文章記錄:

在flask-sqlalchemy中,數據的增刪改查均由數據庫的會話管理的,會話用db.session  來表示。

在準備把數據寫入數據庫前,要先將數據添加到會話中去,然後調用commit( ) 方法提交會話。

 

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('setting.my_config')

db = SQLAlchemy(app)
class Book(db.Model):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(20),nullable=False)
    userpassword = db.Column(db.String(20),nullable=False)
db.create_all(app=app)

一、更新數據庫

這個方法是先刪除所有數據,原有的數據都會被清除,然後在創建一個新的表 (此方法在練習的時候可以用一用)

db.drop_all() # 清除數據庫中所有數據
db.create_all(app=app) 

 

二、數據添加到數據庫

在構建的模型類中,使用關鍵字參數定義數據,然後把定義的實例對象全部添加到會話中去,使用commit( ) 方法把會話提交到數據庫中。

user_1 = Book(username = "呂星辰",userpassword = 123,useraddress = '煙臺') # 定義數據
user_2 = Book(username = "呂小辰",userpassword = 123456,useraddress = '威海') # 定義數據
user_3 = Book(username="呵呵",userpassword='jkla3412',useraddress="外星球") # 定義數據
db.session.add_all([user_1,user_2,user_3]) # 把對象添加到會話中去
db.session.commit() # 把對象提交到數據庫,使用 commit()提交會話

此時刷新數據庫,數據已被添加進去( 我用的是數據庫可視化工具Navicate 

 

三、查詢數據庫

flask-sqlalchemy 爲每一個模型都提供了query對象,用於查詢數據庫

1、查詢全部數據

注意:因爲查詢出來的數據是一個列表,所以不能夠直接通過 result.username來獲取數據,需要遍歷,或者通過 result[ 0 ]的方式來取到某個表(這個表其實就是一個對象)!!!!!!!!!

get()則返回的是單個的對象

result = Book.query.all()
print(result)  #  [<Book 1>, <Book 2>, <Book 3>] 結果是一個列表list,裏邊是所有的表,我們通過循環,拿到每個表中的數據
for i in result:
    print(i.username) # 把每個表中的username 輸出

# 呂星辰
# 呂小辰
# 雞小西

2、如果你不想每次查詢出數據之後遍歷,可以在創建的模型類中添加 __repr__函數 ,直接返回username,這樣直接輸出result的結果就是由具體數據組成的列表了。。。關於__repr__函數我會在下一篇文章中詳細介紹!!!

class Book(db.Model):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(20),nullable=False)
    ··· ···
    def __repr__(self):
        return self.username

3、根據篩選條件來查詢

filter( ) 過濾器方法是查詢的結果進行過濾,括號中是條件判斷;下邊是查詢 username 是'呂星辰' 的所有賬戶名,後邊all( ) 符合條件的數據全都查出來:

res = Book.query.filter(Book.username == '呂星辰').all()
print(res) # [<Book 1>]

下邊是把所有符合條件的第一個數據查出來,因爲數據庫中只有一條username=‘呂星辰’的數據,所以只顯示一個對象:

res = Book.query.filter(Book.username == '呂星辰').first()
print(res) # [<Book 1>]

補充:

關於查詢數據庫除了filter,還有以下過濾器:

過濾器 說明
filter() 把過濾器添加到原查詢上, 返回一個新查詢
filter_by() 把等值過濾器添加到原查詢上, 返回一個新查詢
limit() 使用是zing的值限制原查詢返回的結果數量, 返回一個新查詢
offset() 偏移原查詢返回的結果, 返回一個新查詢
order_by() 根據指定條件對原查詢結果進行排序, 返回一個新查詢
group_by() 根據指定條件對原查詢結果進行分組, 返回一個新查詢

查詢執行函數:

方法 說明
all() 以列表形式返回查詢的所有結果
first() 以列表形式返回查詢的第一個結果,如果沒有結果,則返回 None
first_or_404() 返回查詢的第一個結果,如果未查到,返回404
get() 返回指定主鍵對應的行,如不存在,返回None
get_or_404() 返回指定主鍵對應的行,如不存在,返回404
count() 返回查詢結果的數量
paginate() 返回一個Paginate對象,它包含指定範圍內的結果

 

四、修改數據庫中的數據

先獲取數據,然後在修改數據,修該完需要提交數據。

1、使用get( )方法, 根據id( 主鍵 )來獲取對應行數據,如果沒有則返回None

res = Book.query.get(3)
res.username = "雞小西"
db.session.commit()

res = Book.query.get(10)
print(res) # None

 

2、使用filter過濾器,把過濾出來的數據重新賦值,然後提交會話:

之前說過res是一個列表,所以我用[ ] 的方式來獲取列表中的對象

res = Book.query.filter(Book.username == "呂小辰").all()
res[0].username = '張大力'
db.session.commit()

 

五、刪除數據庫中某些數據

與修改數據庫數據流程一樣,需要先查找到數據,然後進行刪除,最後提交回話:

# 刪除username 是 ‘張大力’的這條數據
res = Book.query.filter(Book.username == "張大力").first()
db.session.delete(res)
db.session.commit()

 

六、數據庫會話回滾

通過db.session.rollback( ) 方法可實現在會話前數據庫的狀態

db.session.rollback()

 

總結:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章