flask創(chuàng)建數(shù)據(jù)庫連接池
在Python中,您可以使用 Flask-SQLAlchemy 這個擴(kuò)展來創(chuàng)建一個數(shù)據(jù)庫連接池。Flask-SQLAlchemy 是一個用于 Flask 框架的 SQLAlchemy 操作封裝,實(shí)現(xiàn)了 ORM(Object Relational Mapper)。ORM 主要用于將類與數(shù)據(jù)庫中的表建立映射關(guān)系,使得我們可以非常方便地通過操作類來操作數(shù)據(jù)庫。
以下是 SQLAlchemy 的一些關(guān)鍵特點(diǎn):
- ORM(Object-Relational Mapping):SQLAlchemy 提供了一套完整的 ORM 系統(tǒng),它可以將數(shù)據(jù)庫表映射為 Python 類,將表中的行映射為這些類的實(shí)例,將列映射為實(shí)例的屬性。通過這種映射,你可以使用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫,而不必編寫 SQL 語句。
- 數(shù)據(jù)庫抽象:SQLAlchemy 提供了一套數(shù)據(jù)庫抽象層,它可以適應(yīng)多種數(shù)據(jù)庫系統(tǒng),如 MySQL、PostgreSQL、SQLite 等。通過這個抽象層,你可以使用相同的 API 操作不同的數(shù)據(jù)庫系統(tǒng)。
- SQL 表達(dá)式語言:除了 ORM,SQLAlchemy 還提供了一套 SQL 表達(dá)式語言,你可以用它來編寫 SQL 語句。這個表達(dá)式語言提供了比原生 SQL 更高級的抽象,可以更方便地編寫復(fù)雜的 SQL 語句。
- 連接池和事務(wù)管理:SQLAlchemy 提供了一套連接池和事務(wù)管理機(jī)制,你可以用它來管理和復(fù)用數(shù)據(jù)庫連接,處理事務(wù)。
在許多 Python web 框架(如 Flask、Pyramid 等)中,SQLAlchemy 都是默認(rèn)或推薦的數(shù)據(jù)庫操作庫。它提供了許多強(qiáng)大的功能,使得數(shù)據(jù)庫操作變得非常方便和高效。
以下是一種創(chuàng)建 Flask-SQLAlchemy 連接池的方式:
- 安裝 Flask-SQLAlchemy。如果您還沒有安裝,可以使用以下命令進(jìn)行安裝:
pip install Flask-SQLAlchemy
- 在你的 Flask 應(yīng)用中設(shè)置 SQLAlchemy 的數(shù)據(jù)庫 URI 和連接池的大?。?/li>
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
app.config['SQLALCHEMY_POOL_SIZE'] = 20
db = SQLAlchemy(app)
上述代碼中 'mysql://username:password@localhost/db_name'
是你的數(shù)據(jù)庫連接信息,你需要替換為實(shí)際的值。SQLALCHEMY_POOL_SIZE
是連接池的大小,你可以根據(jù)實(shí)際需要設(shè)置。
- 使用
db
對象進(jìn)行數(shù)據(jù)庫操作。例如,定義一個模型:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
- 您可以使用
db.session
來進(jìn)行數(shù)據(jù)庫事務(wù),如增刪查改等:
user = User(username='test', email='test@example.com')
db.session.add(user)
db.session.commit()
這樣就實(shí)現(xiàn)了一個 Flask 的 SQLAlchemy 數(shù)據(jù)庫連接池。請注意,如果數(shù)據(jù)庫是 PostgreSQL 或其他類型,需要更改 SQLALCHEMY_DATABASE_URI
中的 'mysql://'
部分。
User模型解釋
上述代碼中的 User
是一個 SQLAlchemy 的模型,它表示了一個數(shù)據(jù)庫表。在這個例子中,這個表的名稱默認(rèn)是 “user”,并且它有三個字段:id,username 和 email。
-
class User(db.Model):
這一行定義了User
類,該類繼承自db.Model
,所以它具有 SQLAlchemy Model 的所有屬性和方法。 -
id = db.Column(db.Integer, primary_key=True)
這一行定義了一個名為 “id” 的列。該列的類型是 Integer,并且它被設(shè)置為表的主鍵。 -
username = db.Column(db.String(80), unique=True, nullable=False)
這一行定義了一個名為 “username” 的列。該列的類型是 String,長度最大為80。unique=True
意味著這個表中的 “username” 必須是唯一的,nullable=False
意味著這個列不能為 NULL。 -
email = db.Column(db.String(120), unique=True, nullable=False)
這一行定義了一個名為 “email” 的列。這個列的類型是 String,長度最大為120。同樣地,unique=True
和nullable=False
分別表示這個列必須具有唯一值,并且不能為 NULL。 -
def __repr__(self):
這是一個魔法方法,當(dāng)你嘗試打印一個User
對象時,Python 會調(diào)用這個方法。在這個例子中,它將返回一個字符串,如<User 'username'>
。
這個 User
模型可以用來操作數(shù)據(jù)庫中的用戶表。例如,你可以使用這個模型來查詢用戶,添加新的用戶,或者刪除用戶。
下面是一個刪除用戶的例子:
user = User.query.filter_by(username='test').first() # 查詢用戶名為 'test' 的用戶
if user:
db.session.delete(user) # 如果用戶存在,就刪除這個用戶
db.session.commit() # 提交事務(wù)
-
user = User.query.filter_by(username='test').first()
:這行代碼查詢數(shù)據(jù)庫中用戶名為 ‘test’ 的用戶。filter_by()
是一個過濾方法,它返回滿足條件的結(jié)果。first()
是一個查詢方法,它返回查詢結(jié)果的第一項(xiàng)。如果查詢結(jié)果為空,那么first()
將返回None
。 -
if user:
:這個判斷語句檢查查詢結(jié)果是否為None
。如果user
為None
,說明數(shù)據(jù)庫中沒有用戶名為 ‘test’ 的用戶,因此我們不能刪除它。如果user
不是None
,說明我們找到了一個用戶名為 ‘test’ 的用戶,因此我們可以刪除它。 -
db.session.delete(user)
:這行代碼刪除查詢到的用戶。delete()
方法接受一個 SQLAlchemy 模型的實(shí)例作為參數(shù),并將其標(biāo)記為待刪除。 -
db.session.commit()
:這行代碼提交事務(wù),將所有的改動(包括刪除操作)保存到數(shù)據(jù)庫。如果你沒有調(diào)用commit()
,那么delete()
的改動不會被保存到數(shù)據(jù)庫。
請注意,如果你嘗試刪除一個不存在的對象,SQLAlchemy 會拋出一個異常。所以在刪除之前,你應(yīng)該檢查你的對象是否存在。
補(bǔ)充
雖然這個User類代表了數(shù)據(jù)庫中的一個表,但是并不意味著這個表已經(jīng)在數(shù)據(jù)庫中創(chuàng)建了。在你第一次操作這個表之前,你需要確保這個表已經(jīng)在數(shù)據(jù)庫中創(chuàng)建。你可以使用 db.create_all()
方法來自動創(chuàng)建所有的表,或者你也可以手動在數(shù)據(jù)庫中創(chuàng)建這個表:
-
使用
db.create_all()
方法。這個方法會自動創(chuàng)建所有定義的但尚未在數(shù)據(jù)庫中存在的表。這個方法通常在 Flask 應(yīng)用啟動時運(yùn)行一次,例如:from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name' db = SQLAlchemy(app) class User(db.Model): # ... db.create_all()
-
手動在數(shù)據(jù)庫中創(chuàng)建這個表。你可以通過 SQL 語句或者數(shù)據(jù)庫管理工具在數(shù)據(jù)庫中創(chuàng)建這個表。文章來源:http://www.zghlxwxcb.cn/news/detail-618501.html
如果你嘗試對一個在數(shù)據(jù)庫中不存在的表進(jìn)行操作(如查詢、添加記錄或刪除記錄),SQLAlchemy 會拋出一個錯誤。所以在操作表之前,你應(yīng)該確保這個表已經(jīng)在數(shù)據(jù)庫中存在。文章來源地址http://www.zghlxwxcb.cn/news/detail-618501.html
到了這里,關(guān)于flask創(chuàng)建數(shù)據(jù)庫連接池的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!