快速上手Flask(三) 在 Flask應(yīng)用中使用Flask-SQLAlchemy
常見情況下對于只有一個 Flask 應(yīng)用,所有您需要做的事情就是創(chuàng)建 Flask 應(yīng)用,選擇加載配置接著創(chuàng)建 SQLAlchemy 對象時候把 Flask 應(yīng)用傳遞給它作為參數(shù)。
SQLAlchemy
官網(wǎng):https://www.sqlalchemy.org/
參考本人 文章:python常用庫之數(shù)據(jù)庫orm框架之SQLAlchemy
什么是Flask-SQLAlchemy
官方文檔:
中文:http://www.pythondoc.com/flask-sqlalchemy/index.html
[推薦]英文:https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/
Flask-SQLAlchemy是一個Flask擴展,用于在Flask應(yīng)用程序中簡化與SQL數(shù)據(jù)庫的交互。它提供了一個集成的ORM(對象關(guān)系映射)工具,使得在Flask應(yīng)用程序中進行數(shù)據(jù)庫操作更加方便和高效。
Flask-SQLAlchemy 和 SQLAlchemy的區(qū)別?
Flask-SQLAlchemy 是基于 SQLAlchemy 的 Flask 擴展,它提供了在 Flask 應(yīng)用中更方便地使用 SQLAlchemy 的功能和特性。
-
集成度:Flask-SQLAlchemy 是針對 Flask 框架的封裝,提供了與 Flask 應(yīng)用無縫集成的功能。它簡化了在 Flask 應(yīng)用中使用 SQLAlchemy 的配置和使用過程,提供了更簡潔的接口和功能。
-
配置:Flask-SQLAlchemy 提供了在 Flask 應(yīng)用中配置 SQLAlchemy 的方式,可以直接在 Flask 配置中進行數(shù)據(jù)庫相關(guān)的配置。而 SQLAlchemy 需要單獨進行配置,通常使用一個獨立的配置文件或模塊。
-
上下文管理:Flask-SQLAlchemy 自動處理了 SQLAlchemy 的上下文管理,確保在每個請求中使用正確的數(shù)據(jù)庫會話。它與 Flask 的應(yīng)用上下文和請求上下文無縫集成,提供了更方便的數(shù)據(jù)庫操作方式。
-
擴展功能:Flask-SQLAlchemy 提供了一些額外的功能和特性,如自動提交和回滾事務(wù)、自動創(chuàng)建數(shù)據(jù)庫表、數(shù)據(jù)庫遷移等。它還與 Flask-WTF 和 Flask-Admin 等其他 Flask 擴展集成得更緊密,提供了更豐富的功能和集成選項。
總結(jié):
- SQLAlchemy:是一個獨立的ORM框架,可以獨立與Flask存在,也可以在其他項目中使用,比如在Django中。
- Flask-SQLAlchemy:對SQLAlchemy的一個封裝,能夠更適合在Flask中使用。
您僅需要知道與普通的 SQLAlchemy 不同之處:
- SQLAlchemy 允許您訪問下面的東西:
- sqlalchemy 和 sqlalchemy.orm 下所有的函數(shù)和類
- 一個叫做 session 的預(yù)配置范圍的會話(session)
- metadata 屬性
- engine 屬性
- SQLAlchemy.create_all() 和 SQLAlchemy.drop_all(),根據(jù)模型用來創(chuàng)建以及刪除表格的方法
- 一個 Model 基類,即是一個已配置的聲明(declarative)的基礎(chǔ)(base)
- Model 聲明基類行為類似一個常規(guī)的 Python 類,不過有個 query 屬性,可以用來查詢模型 (Model 和 BaseQuery)
- 您必須提交會話,但是沒有必要在每個請求后刪除它(session),F(xiàn)lask-SQLAlchemy 會幫您完成刪除操作。
Flask-SQLAlchemy基本使用
安裝:
pip install -U Flask-SQLAlchemy
快速入門
快速入門
參考URL: http://www.pythondoc.com/flask-sqlalchemy/quickstart.html
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db'
db = SQLAlchemy(app)
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 __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
在 Flask 中使用 SQLAlchemy 進行數(shù)據(jù)庫操作時,你應(yīng)該在全局范圍內(nèi)創(chuàng)建一個 db 對象。
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.pool import QueuePool
db = SQLAlchemy()
# 數(shù)據(jù)庫連接配置
DATABASE_URI = 'postgresql://username:password@localhost:5432/database_name'
DATABASE_TRACK_MODIFICATIONS = False
# SQLAlchemy配置
SQLALCHEMY_DATABASE_URI = DATABASE_URI
SQLALCHEMY_TRACK_MODIFICATIONS = DATABASE_TRACK_MODIFICATIONS
SQLALCHEMY_ENGINE_OPTIONS = {
'poolclass': QueuePool,
'pool_size': 10,
'max_overflow': 5,
'pool_pre_ping': True
}
# 創(chuàng)建數(shù)據(jù)庫引擎
engine = create_engine(DATABASE_URI, poolclass=QueuePool, pool_size=10, max_overflow=5, pool_pre_ping=True)
SQLALCHEMY_ENGINE_OPTIONS:這是SQLAlchemy的引擎配置選項,用于配置連接池的相關(guān)參數(shù),例如pool_size和max_overflow。
engine:這是使用create_engine函數(shù)創(chuàng)建的數(shù)據(jù)庫引擎對象,可以在需要直接使用底層引擎的情況下使用。
在你的代碼中,你已經(jīng)正確地創(chuàng)建了一個 db 對象,并將其與 Flask 應(yīng)用程序綁定。這樣做可以確保在整個應(yīng)用程序中使用相同的數(shù)據(jù)庫實例。
from flask import Flask
from api import create_app
from sqlalchemy_db import db, SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS, SQLALCHEMY_ENGINE_OPTIONS
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
# 配置數(shù)據(jù)庫連接URI和選項
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = SQLALCHEMY_ENGINE_OPTIONS
# 將db對象與Flask應(yīng)用程序關(guān)聯(lián)
db.init_app(app)
在執(zhí)行原生SQL語句時,使用engine對象。
以下是一個示例代碼,演示了如何使用engine對象執(zhí)行原生SQL查詢:
from sqlalchemy_db import engine
def execute_native_sql(query):
with engine.connect() as connection:
result = connection.execute(query)
for row in result:
print(row)
# 示例查詢
query = "SELECT * FROM users"
execute_native_sql(query)
在上面的代碼中,我們創(chuàng)建了一個execute_native_sql函數(shù),它使用engine對象執(zhí)行原生SQL查詢并打印結(jié)果。
請注意,在使用engine對象時,你需要根據(jù)具體的情況選擇適當?shù)纳舷挛墓芾砥鳎╳ith語句)來保證連接的正確關(guān)閉。
如果你只是想使用SQLAlchemy的ORM功能(例如定義模型類、執(zhí)行查詢等),則可以直接使用db對象,而不需要直接使用engine對象。
創(chuàng)建模型
在使用SQLAlchemy之前,你需要先定義數(shù)據(jù)庫模型類。模型類代表了數(shù)據(jù)庫中的表結(jié)構(gòu),并提供了與表相關(guān)聯(lián)的字段和方法。
from sqlalchemy_db import db
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), unique=True, nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
def __repr__(self):
return f'<User(id={self.id}, username={self.username}, email={self.email})>'
在上面的示例中,我們定義了一個名為User的模型類,它對應(yīng)了數(shù)據(jù)庫中的users表。User類繼承了db.Model,這是SQLAlchemy提供的基類。
from sqlalchemy_db import db
from models import User
# 創(chuàng)建數(shù)據(jù)庫表
db.create_all()
# 創(chuàng)建一個新用戶
user = User(username='john', email='john@example.com')
db.session.add(user)
db.session.commit()
# 查詢所有用戶
users = User.query.all()
for user in users:
print(user)
# 查詢特定用戶
user = User.query.filter_by(username='john').first()
print(user)
# 更新用戶信息
user.email = 'newemail@example.com'
db.session.commit()
# 刪除用戶
db.session.delete(user)
db.session.commit()
我們使用db.session來進行數(shù)據(jù)庫操作,例如添加、查詢、更新和刪除用戶記錄。
flask模型對象如何json序列化輸出
[推薦]Flask 學(xué)習(xí)-36.Flask-RESTful 序列化輸出對象
參考URL:https://www.cnblogs.com/yoyoketang/p/16648730.html
通過flask-SQLAlchemy這一ORM工具所構(gòu)建的數(shù)據(jù)庫表模型,通過其語句所取出的數(shù)據(jù)通常是object類型的,這一類型并不能直接在方法中return返回一個JSON格式,因此需要先對從數(shù)據(jù)庫中取出的數(shù)據(jù)進行序列化,然后再return給前端。
在網(wǎng)絡(luò)上找到的三種序列化方法如下:
在模型定義的時候給序列化的方法
繼承改寫 flask 里面的 JSONEncoder類以及default方法
使用Marshmallow
】
裝飾器marshal_with實際上是獲取您的數(shù)據(jù)對象并應(yīng)用字段過濾。編組可以處理單個對象、字典或?qū)ο罅斜怼?/p>
https://www.cnblogs.com/yoyoketang/p/16648730.html
使用Flask-RESTful 提供的 fields 模塊序列化輸出需要的字段
from flask_restful import Resource, fields, marshal_with
user_fields = {
‘id’: fields.Integer,
‘username’: fields.String,
‘is_active’: fields.Boolean
}
class UserInfo(Resource):
@marshal_with(user_fields)
def get(self):
user = Users.query.get(1)
print(f'查詢到的數(shù)據(jù):{user}')
return user
marshal_with 裝飾器只能對return的對象序列化,這里可以使用 marshal() 函數(shù)實現(xiàn)部分序列化
數(shù)據(jù)庫的增刪改查
Flask和SQLAlchemy的模型操作:增刪改查方法詳解
參考URL: https://www.51cto.com/article/757138.html
查詢模型
在Flask和SQLAlchemy中,我們可以使用以下方法來查詢模型:
查詢所有模型:
users = User.query.all()
這將返回所有的用戶模型對象。
查詢單個模型:
user = User.query.filter_by(username='john').first()
這將返回一個用戶名為’john’的用戶模型對象。
使用復(fù)雜查詢:
users = User.query.filter(User.email.endswith('@example.com')).all()
這將返回所有電子郵件以’@example.com’結(jié)尾的用戶模型對象。
修改模型
在Flask和SQLAlchemy中,我們可以使用以下方法來修改模型:
修改單個屬性:
user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
db.session.commit()
修改多個屬性:
user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
user.password = 'newpassword'
db.session.commit()
這將修改用戶名為’john’的用戶的電子郵件和密碼,并將更改保存到數(shù)據(jù)庫。
刪除模型
在Flask和SQLAlchemy中,我們可以使用以下方法來刪除模型:
刪除單個模型:
user = User.query.filter_by(username='john').first()
db.session.delete(user)
db.session.commit()
這將刪除用戶名為’john’的用戶模型對象,并將更改保存到數(shù)據(jù)庫。
刪除多個模型:
users = User.query.filter_by(email='oldemail@example.com').all()
for user in users:
db.session.delete(user)
db.session.commit()
完整的代碼示例如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)
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)
password = db.Column(db.String(120), nullable=False)
def __repr__(self):
return '<User %r>' % self.username
# create database tables
db.create_all()
# add a new user to the database
user = User(username='john', email='john@example.com', password='password')
db.session.add(user)
db.session.commit()
# query all users
users = User.query.all()
print(users)
# query a single user
user = User.query.filter_by(username='john').first()
print(user)
# modify a user's email
user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
user.password = 'newpassword'
db.session.commit()
# delete a user
user = User.query.filter_by(username='john').first()
db.session.delete(user)
db.session.commit()
首先定義了一個User模型類,并使用db.create_all()方法創(chuàng)建了數(shù)據(jù)庫表格。接著,我們添加了一個新用戶到數(shù)據(jù)庫中,并使用User.query.all()和User.query.filter_by()方法查詢了用戶。然后,我們修改了用戶的電子郵件和密碼,并使用db.session.commit()方法將更改保存到數(shù)據(jù)庫。最后,我們使用db.session.delete()方法刪除了用戶,并使用db.session.commit()方法將更改保存到數(shù)據(jù)庫。
工作常用總結(jié)
在 SQLAlchemy 中,怎么判斷刪除是否成功?
官方文檔:https://docs.sqlalchemy.org/en/14/orm/query.html#sqlalchemy.orm.Query.delete
文章來源:http://www.zghlxwxcb.cn/news/detail-823555.html
在 SQLAlchemy 中,可以使用 execute() 方法執(zhí)行 DELETE 語句,delete() 方法返回的是一個整數(shù),表示被刪除的記錄數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-823555.html
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 創(chuàng)建引擎和Session
engine = create_engine('sqlite:///test.db')
session = sessionmaker(bind=engine)()
try:
# 定義模型類(這里以User為例)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
# 查詢所有名字為"John"的用戶
users = session.query(User).filter(User.name == "John").all()
if len(users) > 0:
# 刪除第一個找到的用戶
deleted_count = session.delete(users[0])
print("已刪除{}個用戶".format(deleted_count))
session.commit()
else:
print("未找到任何符合條件的用戶")
except Exception as e:
print("刪除失?。?, str(e))
finally:
session.close()
到了這里,關(guān)于快速上手Flask(三) 在 Flask應(yīng)用中使用Flask-SQLAlchemy(flask SQLAlchemy模型對象如何json序列化輸出)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!