前言:
數據庫是大多數 Web 應用的基礎設施,只要想把數據存儲下來,就離不開數據庫,下面將一起學習一下如何給 Flask 應用添加數據庫支持。
1、使用Flask-SQLAlchemy管理數據庫
Flask-SQLAlchemy
集成了 SQLAlchemy
,它簡化了連接數據庫服務器、管理數據庫及操作會話等各類工作,讓 Flask
更方便的進行數據存儲及處理,我們不必過多關心原生 SQL 語句,只需要使用 Python
類就可以輕松的完成對數據庫表的增刪改查操作,并且該插件還支持多種數據庫類型,如MySQL
、PostgreSQL
、和SQLite
等。
我們可以使用pip install flask-sqlalchemy
進行安裝。
1.1 配置Flask_SQLAlchemy
下面以 SQLite
數據庫為例,Flask-SQLAlchemy
數據庫的 url 通過配置變量SQLALCHEMY_DATABASE_URI
指定,通過 Flask-SQLAlchemy
提供的 SQLAlchemy
類傳入 Flask 的實例 app,創建 db 實例,表示程序使用的數據庫,這個 db 對象能夠使用 Flask-SQLAlchemy
的所有功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
配置變量表示是否追蹤對象的修改,在此設為False
。
1.2 定義數據庫模型
所謂數據模型,就是用來映射數據庫表的 Python
類,一個數據模型類對應數據庫中的一個表,類的屬性代表數據庫表的字段。所有的模型類都需要繼承 Flask-SQLAlchemy
提供db.Model
基類。
新建model.py文件,定義User類如下:
1
2
3
4
5
6
7
8
9
|
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 創建數據庫和表
運行 Flask
應用,然后在終端中輸入flask shell
命令,進入 Python
交互環境
如下所示:
1
2
3
4
5
|
>>> from app import db # 從app.py中導入db實例 >>> from model import * # 從model.py中導入所有模型類 >>> db.create_all() # 用db.create_all()創建數據庫表 |
執行完之后,會在項目根目錄生成一個data.db
庫文件。 注意: 數據庫和表一旦創建后,之后對模型類的改動不會自動作用到實際的表中,比如,在模型類中添加或刪除字段,修改字段的名稱和類型,再次調用db.create_all()
不會重新創建表或是更新表,只有通過db.drop_all()
刪除數據庫中所有的表之后再調用db.create_all()
才能重新創建表,
那么就會出現這么一個問題:
這樣操作的話,數據庫表被刪除重建了,那表中原有的數據也都沒有了,這肯定是不行的,這時就出現了數據庫遷移的概念,先留個坑,下篇文章介紹。
1.4 數據庫操作
現在我們創建了模型,也生成了數據庫和表,接下來就來學習一下常用的數據庫操作。數據庫操作主要是CRUD
(Create
創建、Read
讀取/查詢、 Update
更新、Delete
刪除)。
1.4.1 Create
添加一條記錄到數據庫中,主要分為以下三步:
-
使用
Python
模型類創建對象作為一條記錄 - 添加新創建的對象到數據庫會話中
- 提交數據庫會話
如下,在上面的交互環境下,創建一個新用戶:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
>>> from app import db # 從app.py中導入db實例 >>> from model import User # 導入模型類User >>> user1 = User(user_name = 'tigeriaf' , password = '123456' ) # 創建用戶1 >>> user2 = User(user_name = 'admin' , password = '123456' ) # 創建用戶2 # 添加新創建的對象到數據庫會話中 >>> db.session.add(user1) >>> db.session.add(user2) # 將數據庫會話提交,數據寫入data.db文件 >>> db.session.commit() # 測試 >>> print (user1. id ) 1 >>> print (user2. id ) 2 |
另外,除了依次調用add()
方法添加記錄,也可以使用add_all()
一次添加包含多個模型類對象的列表。
1.4.2 Read
使用模型類
提供的 query
屬性 通過模型類提供的 query
屬性附加調用各種過濾方法可以查詢數據庫表的數據,
查詢模式如下:
<模型類>.query.<過濾方法>.<查詢方法>
從某個模型類出發,通過在 query
屬性對應的 Query
對象上附加的過濾方法和查詢函數對模型類對應的表中的記 進行各種篩選等,最終返回包含對應數據庫記錄數據的模型類實例,對返回的實例調用屬性即可獲取對應的字段數據。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# 查詢全部 >>> User.query. all () [<User 1 >, <User 2 >] # 查詢指定id的記錄 >>> user1 = User.query.get( 1 ) >>> user1.user_name 'tigeriaf' # 查詢條數 >>> 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
更新一條記錄非常簡單,直接給模型類的屬性附上新的值,然后調用commit()
方法提交會話即可。 如下,修改 id
為 2
的用戶的用戶名 user_name
。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> user2 = User.query.get( 2 ) >>> user2.user_name 'admin' >>> user2.user_name = '張三' >>> db.session.commit() >>> user2.user_name '張三' |
1.4.4 Delete
使用delete()進行數據記錄的刪除,如下:
1
2
3
4
5
6
7
8
9
|
>>> db.session.delete(user2) >>> db.session.commit() >>> user2 = User.query.get( 2 ) >>> print (user2) None |
1.4.5 在視圖函數里操作數據庫
在視圖函數里操作數據庫的方式在 Python Shell
交互環境下大致是相同的,無非就是多了從請求對象獲取數據及驗證數據的步驟,
如下一個案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
@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' |
上述代碼中,視圖函數 user
接受兩種方式的請求,分別完成添加用戶、查詢用戶的功能,將接收數據存儲在數據庫中。
發送請求測試如下:
到此這篇關于 Flask 數據庫集成的介紹的文章就介紹到這了,更多相關 Flask 數據庫集成內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/7031700120924405773