Flask 數(shù)據(jù)庫集成的介紹
前言:
數(shù)據(jù)庫是大多數(shù) Web 應(yīng)用的基礎(chǔ)設(shè)施,只要想把數(shù)據(jù)存儲下來,就離不開數(shù)據(jù)庫,下面將一起學習一下如何給 Flask 應(yīng)用添加數(shù)據(jù)庫支持。
1、使用Flask-SQLAlchemy管理數(shù)據(jù)庫
Flask-SQLAlchemy 集成了 SQLAlchemy,它簡化了連接數(shù)據(jù)庫服務(wù)器、管理數(shù)據(jù)庫及操作會話等各類工作,讓 Flask 更方便的進行數(shù)據(jù)存儲及處理,我們不必過多關(guān)心原生 SQL 語句,只需要使用 Python 類就可以輕松的完成對數(shù)據(jù)庫表的增刪改查操作,并且該插件還支持多種數(shù)據(jù)庫類型,如MySQL、PostgreSQL、和SQLite等。
我們可以使用pip install flask-sqlalchemy進行安裝。
1.1 配置Flask_SQLAlchemy
下面以 SQLite 數(shù)據(jù)庫為例,Flask-SQLAlchemy 數(shù)據(jù)庫的 url 通過配置變量SQLALCHEMY_DATABASE_URI指定,通過 Flask-SQLAlchemy 提供的 SQLAlchemy 類傳入 Flask 的實例 app,創(chuàng)建 db 實例,表示程序使用的數(shù)據(jù)庫,這個 db 對象能夠使用 Flask-SQLAlchemy 的所有功能。
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) basedir = os.path.abspath(app.root_path) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.db') app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)
其中,SQLALCHEMY_TRACK_ MODIFICATIONS配置變量表示是否追蹤對象的修改,在此設(shè)為False。
1.2 定義數(shù)據(jù)庫模型
所謂數(shù)據(jù)模型,就是用來映射數(shù)據(jù)庫表的 Python 類,一個數(shù)據(jù)模型類對應(yīng)數(shù)據(jù)庫中的一個表,類的屬性代表數(shù)據(jù)庫表的字段。所有的模型類都需要繼承 Flask-SQLAlchemy 提供db.Model基類。
新建model.py文件,定義User類如下:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_name = db.Column(db.String)
password = db.Column(db.String)
1.3 創(chuàng)建數(shù)據(jù)庫和表
運行 Flask 應(yīng)用,然后在終端中輸入flask shell命令,進入 Python 交互環(huán)境
如下所示:
>>> from app import db # 從app.py中導入db實例 >>> from model import * # 從model.py中導入所有模型類 >>> db.create_all() # 用db.create_all()創(chuàng)建數(shù)據(jù)庫表
執(zhí)行完之后,會在項目根目錄生成一個data.db庫文件。 注意: 數(shù)據(jù)庫和表一旦創(chuàng)建后,之后對模型類的改動不會自動作用到實際的表中,比如,在模型類中添加或刪除字段,修改字段的名稱和類型,再次調(diào)用db.create_all()不會重新創(chuàng)建表或是更新表,只有通過db.drop_all()刪除數(shù)據(jù)庫中所有的表之后再調(diào)用db.create_all()才能重新創(chuàng)建表,
那么就會出現(xiàn)這么一個問題:
這樣操作的話,數(shù)據(jù)庫表被刪除重建了,那表中原有的數(shù)據(jù)也都沒有了,這肯定是不行的,這時就出現(xiàn)了數(shù)據(jù)庫遷移的概念,先留個坑,下篇文章介紹。
1.4 數(shù)據(jù)庫操作
現(xiàn)在我們創(chuàng)建了模型,也生成了數(shù)據(jù)庫和表,接下來就來學習一下常用的數(shù)據(jù)庫操作。數(shù)據(jù)庫操作主要是CRUD(Create 創(chuàng)建、Read 讀取/查詢、 Update 更新、Delete 刪除)。
1.4.1 Create
添加一條記錄到數(shù)據(jù)庫中,主要分為以下三步:
- 使用
Python模型類創(chuàng)建對象作為一條記錄 - 添加新創(chuàng)建的對象到數(shù)據(jù)庫會話中
- 提交數(shù)據(jù)庫會話
如下,在上面的交互環(huán)境下,創(chuàng)建一個新用戶:
>>> from app import db # 從app.py中導入db實例 >>> from model import User # 導入模型類User >>> user1=User(user_name='tigeriaf', password='123456') # 創(chuàng)建用戶1 >>> user2=User(user_name='admin', password='123456') # 創(chuàng)建用戶2 # 添加新創(chuàng)建的對象到數(shù)據(jù)庫會話中 >>> db.session.add(user1) >>> db.session.add(user2) # 將數(shù)據(jù)庫會話提交,數(shù)據(jù)寫入data.db文件 >>> db.session.commit() # 測試 >>> print(user1.id) 1 >>> print(user2.id) 2

另外,除了依次調(diào)用add()方法添加記錄,也可以使用add_all()一次添加包含多個模型類對象的列表。
1.4.2 Read
使用模型類
提供的 query 屬性 通過模型類提供的 query 屬性附加調(diào)用各種過濾方法可以查詢數(shù)據(jù)庫表的數(shù)據(jù),
查詢模式如下:
<模型類>.query.<過濾方法>.<查詢方法>
從某個模型類出發(fā),通過在 query 屬性對應(yīng)的 Query 對象上附加的過濾方法和查詢函數(shù)對模型類對應(yīng)的表中的記 進行各種篩選等,最終返回包含對應(yīng)數(shù)據(jù)庫記錄數(shù)據(jù)的模型類實例,對返回的實例調(diào)用屬性即可獲取對應(yīng)的字段數(shù)據(jù)。
# 查詢?nèi)? >>> User.query.all() [<User 1>, <User 2>] # 查詢指定id的記錄 >>> user1=User.query.get(1) >>> user1.user_name 'tigeriaf' # 查詢條數(shù) >>> User.query.count() 2 # 查詢user_name為admin的用戶 >>> User.query.filter_by(user_name='admin').all() [<User 2>]
SQLAlcherny 提供了很多過濾方法,使用這些過濾方法可以獲取更精確的查詢,這里就不展開了。 完整的查詢、過濾方法可以查看:The Query Object。
1.4.3 Update
更新一條記錄非常簡單,直接給模型類的屬性附上新的值,然后調(diào)用commit()方法提交會話即可。 如下,修改 id 為 2 的用戶的用戶名 user_name。
>>> user2=User.query.get(2) >>> user2.user_name 'admin' >>> user2.user_name='張三' >>> db.session.commit() >>> user2.user_name '張三'
1.4.4 Delete
使用delete()進行數(shù)據(jù)記錄的刪除,如下:
>>> db.session.delete(user2) >>> db.session.commit() >>> user2=User.query.get(2) >>> print(user2) None
1.4.5 在視圖函數(shù)里操作數(shù)據(jù)庫
在視圖函數(shù)里操作數(shù)據(jù)庫的方式在 Python Shell 交互環(huán)境下大致是相同的,無非就是多了從請求對象獲取數(shù)據(jù)及驗證數(shù)據(jù)的步驟,
如下一個案例:
@app.route('/user', methods=['GET', 'POST'])
def user():
if request.method == 'POST':
user_name = request.form['user_name']
password = request.form['password']
user = User(user_name=user_name, password=password)
db.session.add(user)
db.session.commit()
return 'user:{} add success! id:{}'.format(user_name, user.id)
else:
user_id = request.args.get('user_id')
user = User.query.get(user_id)
if user:
return 'Hello user:{}!'.format(user.user_name)
else:
return 'failed'
上述代碼中,視圖函數(shù) user 接受兩種方式的請求,分別完成添加用戶、查詢用戶的功能,將接收數(shù)據(jù)存儲在數(shù)據(jù)庫中。
發(fā)送請求測試如下:

到此這篇關(guān)于 Flask 數(shù)據(jù)庫集成的介紹的文章就介紹到這了,更多相關(guān) Flask 數(shù)據(jù)庫集成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Python描述數(shù)據(jù)結(jié)構(gòu)之KMP篇
這篇文章主要介紹了Python描述數(shù)據(jù)結(jié)構(gòu)之KMP篇,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
利用python 更新ssh 遠程代碼 操作遠程服務(wù)器的實現(xiàn)代碼
這篇文章主要介紹了利用python 更新ssh 遠程代碼 操作遠程服務(wù)器的實現(xiàn)代碼,需要的朋友可以參考下2018-02-02
Python基礎(chǔ)常用內(nèi)建函數(shù)圖文示例解析
這篇文章主要為大家Python常用內(nèi)建函數(shù),文中通過圖例詳細的給大家作出了講解分析,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
Pytorch之tensorboard無法啟動和顯示問題及解決
這篇文章主要介紹了Pytorch之tensorboard無法啟動和顯示問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

