本文將詳細(xì)介紹在Flask Web應(yīng)用中如何設(shè)計(jì)數(shù)據(jù)庫(kù)模型,并使用Flask-SQLAlchemy等擴(kuò)展進(jìn)行數(shù)據(jù)庫(kù)操作的最佳實(shí)踐。內(nèi)容涵蓋數(shù)據(jù)模型設(shè)計(jì),ORM使用,關(guān)系映射,查詢方法,事務(wù)處理等方面。通過(guò)本文,您可以掌握Flask數(shù)據(jù)庫(kù)應(yīng)用的基本知識(shí)。
Flask作為一個(gè)流行的Python Web框架,提供了高度的靈活性來(lái)構(gòu)建Web應(yīng)用程序。但是Flask本身不包含數(shù)據(jù)庫(kù)抽象層,所以我們需要選擇合適的數(shù)據(jù)庫(kù)工具來(lái)輔助開(kāi)發(fā)。
1. 數(shù)據(jù)庫(kù)工具選擇
要在Flask中集成數(shù)據(jù)庫(kù)操作,我們通常有以下幾種選擇:
-
原生SQL:直接使用Python中的DBAPI,如MySQL-Python等,編寫(xiě)SQL語(yǔ)句操作數(shù)據(jù)庫(kù)。但這需要自行處理許多細(xì)節(jié)。
-
SQLAlchemy:這是一個(gè)非常強(qiáng)大的ORM框架,可以映射Python對(duì)象到數(shù)據(jù)庫(kù)表,簡(jiǎn)化數(shù)據(jù)庫(kù)操作。推薦用于復(fù)雜項(xiàng)目。
-
Flask-SQLAlchemy:這是在Flask中整合SQLAlchemy的擴(kuò)展,可以便捷地將其與Flask應(yīng)用結(jié)合使用。
-
其他擴(kuò)展:如Flask-MongoEngine for MongoDB,Flask-Pony for PonyORM等。
考慮到SQLAlchemy提供的便利性,我們這里選擇使用Flask-SQLAlchemy來(lái)示例Flask的數(shù)據(jù)庫(kù)用法。
2. 安裝Flask-SQLAlchemy
使用pip安裝Flask-SQLAlchemy:
pip install flask-sqlalchemy
然后在Flask應(yīng)用中進(jìn)行初始化:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
3. 定義模型
使用Flask-SQLAlchemy時(shí),數(shù)據(jù)庫(kù)使用ORM映射模型表示。我們可以定義代表表的Model類:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __repr__(self):
return '<User %r>' % self.username
User類表示users表,類的屬性映射到表的列。有PrimaryKey,Unique等約束。
4. 創(chuàng)建表
有了Model類定義,我們可以通過(guò)migrate命令創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫(kù)表:
flask db init
flask db migrate
flask db upgrade
這將根據(jù)Model類創(chuàng)建數(shù)據(jù)庫(kù)表。
5. CRUD操作
有了映射表,我們就可以進(jìn)行常規(guī)的CRUD操作:
創(chuàng)建
user = User(username='greyli', email='greyli@example.com')
db.session.add(user)
db.session.commit()
查詢
User.query.get(1) # 主鍵查詢
User.query.filter_by(username='greyli').first() # 條件查詢
更新
user = User.query.get(1)
user.username = 'new username'
db.session.commit() # 提交更新
刪除
user = User.query.get(1)
db.session.delete(user)
db.session.commit() # 提交刪除
可以看到Flask-SQLAlchemy為這些常見(jiàn)操作提供了簡(jiǎn)單的API。
6. 關(guān)系映射
關(guān)系映射也是ORM的重要功能之一。例如一篇文章可對(duì)應(yīng)多個(gè)標(biāo)簽,我們可以定義:
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), unique=True)
tags = db.relationship('Tag', backref='article', lazy='dynamic')
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
這樣Article和Tag之間就建立了一對(duì)多的關(guān)系,可以方便地查詢:
article = Article.query.get(1)
tags = article.tags
7. 事務(wù)處理
事務(wù)處理可以保證數(shù)據(jù)庫(kù)操作的完整性:
try:
article = Article(title='my article')
db.session.add(article)
db.session.commit()
except:
db.session.rollback()
raise
這樣可以回滾錯(cuò)誤的修改,保證事務(wù)的原子性。
補(bǔ)充
在Flask應(yīng)用中,這幾條命令是用于數(shù)據(jù)庫(kù)遷移的:
- flask db init
這個(gè)命令會(huì)初始化一個(gè)遷移倉(cāng)庫(kù),在migrations文件夾下創(chuàng)建必要的文件。這個(gè)遷移倉(cāng)庫(kù)用于追蹤數(shù)據(jù)庫(kù)模式的變更。
- flask db migrate
這個(gè)命令會(huì)自動(dòng)比對(duì)模型定義和現(xiàn)有數(shù)據(jù)庫(kù)的差異,然后生成一個(gè)遷移腳本,放在migrations/versions文件夾下。
這個(gè)遷移腳本包含了使數(shù)據(jù)庫(kù)模式達(dá)到我們模型定義的狀態(tài)所需要的操作指令(如創(chuàng)建新表,添加字段等)。
- flask db upgrade
這個(gè)命令則會(huì)執(zhí)行遷移倉(cāng)庫(kù)中所有的遷移腳本,實(shí)際更新數(shù)據(jù)庫(kù)模式,使數(shù)據(jù)庫(kù)與模型一致。
所以這三步命令的作用是:
-
初始化遷移倉(cāng)庫(kù)
-
生成遷移腳本
-
執(zhí)行遷移操作
當(dāng)我們修改了模型類的時(shí)候,只需要再次運(yùn)行:
flask db migrate
flask db upgrade
就可以自動(dòng)更新數(shù)據(jù)庫(kù),非常方便。
這樣做的好處是可以很好地追蹤數(shù)據(jù)庫(kù)模式的變遷,同時(shí)可以通過(guò)downgrade回滾變更。總體上可以更輕松地管理數(shù)據(jù)庫(kù)模式。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-624945.html
所以Flask強(qiáng)烈建議使用這套遷移機(jī)制來(lái)維護(hù)數(shù)據(jù)庫(kù),而不是直接修改數(shù)據(jù)庫(kù)模式。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-624945.html
到了這里,關(guān)于flask數(shù)據(jù)庫(kù)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!