欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > FastAPI使用异步 ORM 进行高效数据库操作与管理

FastAPI使用异步 ORM 进行高效数据库操作与管理

2025/11/19 15:20:42 来源:https://blog.csdn.net/weixin_52392194/article/details/145025103  浏览:    关键词:FastAPI使用异步 ORM 进行高效数据库操作与管理

FastAPI使用异步 ORM 进行高效数据库操作与管理

目录

  1. 📊 异步 ORM 与数据库操作概述
  2. 🛠️ Tortoise ORM 的使用与集成
  3. Gino ORM 与 FastAPI 的结合
  4. 🌐 使用 asyncio 管理并发数据库连接
  5. 🔄 管理异步数据库事务

1. 📊 异步 ORM 与数据库操作概述

在现代 Web 开发中,异步编程已经成为提升性能的关键手段,尤其是当涉及到大量 I/O 操作(如数据库交互)时,异步编程能够有效地提升响应速度和吞吐量。在 FastAPI 中,异步数据库操作不仅提升了应用的性能,还能够更好地与 FastAPI 的异步特性(例如异步请求处理)结合,使得整个应用更加高效、流畅。

传统的 ORM(对象关系映射)库,如 SQLAlchemy,通常是同步的,这意味着它们在进行数据库查询时会阻塞应用的执行。而异步 ORM 则可以在进行数据库操作时不阻塞主线程,允许应用同时处理其他请求。对于高并发场景,尤其是在 I/O 密集型的应用中,使用异步 ORM 可以显著提高效率。

在 Python 生态中,有几个流行的异步 ORM 选择,其中包括 Tortoise ORMGino ORM。这两个库都能够与 FastAPI 无缝集成,支持异步查询和事务管理。接下来,我们将深入探讨如何在 FastAPI 中使用这些异步 ORM 进行数据库操作,并掌握异步事务的管理技巧。


2. 🛠️ Tortoise ORM 的使用与集成

Tortoise ORM 是一个专为 Python 异步开发设计的 ORM,它提供了高效、易用的数据库操作功能,支持异步查询和事务。它特别适合与 FastAPI 配合使用,能够简化数据库操作并提升性能。

2.1 安装与配置

首先,安装 Tortoise ORM 及其异步数据库驱动。以 SQLite 为例,执行以下命令进行安装:

pip install tortoise-orm aiosqlite

然后,配置 FastAPI 与 Tortoise ORM 的连接:

from fastapi import FastAPI
from tortoise import Tortoise, fields
from tortoise.models import Model
from tortoise.contrib.fastapi import HTTPNotFoundError, register_tortoiseapp = FastAPI()class Item(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=255)price = fields.FloatField()# Tortoise ORM 配置
@app.on_event("startup")
async def startup():await Tortoise.init(db_url='sqlite://db.sqlite3',  # 数据库 URLmodules={'models': ['__main__']}  # 模型所在模块)await Tortoise.generate_schemas()@app.on_event("shutdown")
async def shutdown():await Tortoise.close_connections()# 路由示例
@app.get("/items/{item_id}")
async def get_item(item_id: int):item = await Item.get_or_none(id=item_id)if item is None:raise HTTPNotFoundError(f"Item with id {item_id} not found")return item
2.2 异步操作与查询

Tortoise ORM 完全支持异步操作,这意味着所有的数据库操作都是非阻塞的。例如,查询操作 Item.get_or_none() 会返回一个协程对象,开发者可以使用 await 进行等待。

@app.get("/items/")
async def get_items():items = await Item.all()  # 获取所有项return items

在上面的代码中,Item.all() 方法返回所有记录,这种方式非常适合在高并发场景下使用。所有的数据库查询操作都能在不阻塞主线程的情况下进行。

2.3 处理复杂查询

Tortoise ORM 还支持链式查询,使得查询操作更加灵活和高效。例如,使用 filterexclude 进行更复杂的查询:

@app.get("/items/filter/")
async def filter_items(min_price: float, max_price: float):items = await Item.filter(price__gte=min_price, price__lte=max_price).all()return items

在这个例子中,我们使用了 filter 方法来进行价格范围的筛选,gtelte 分别表示大于等于和小于等于。

2.4 数据模型与验证

与 FastAPI 的 Pydantic 模型类似,Tortoise ORM 也支持数据模型的定义。模型可以通过 fields 类来定义每个字段的数据类型,支持常见的字段类型(如 IntFieldCharFieldFloatField 等)。这些模型不仅是数据库表的映射,同时也可以用于请求数据的验证和响应格式的定义。


3. ⚡ Gino ORM 与 FastAPI 的结合

另一个流行的异步 ORM 库是 Gino,它基于 SQLAlchemyasyncpg,专为 PostgreSQL 设计,能够提供高效的异步数据库访问。Gino 具有灵活的查询接口,并且与 FastAPI 完美集成,使得开发者能够轻松处理异步数据库操作。

3.1 安装与配置

首先,安装 Gino 和 PostgreSQL 驱动:

pip install gino asyncpg

然后,配置 FastAPI 与 Gino ORM 的连接:

from fastapi import FastAPI
from gino import Gino
from sqlalchemy import Column, Integer, String, Floatapp = FastAPI()db = Gino()class Item(db.Model):__tablename__ = 'items'id = Column(Integer, primary_key=True)name = Column(String)price = Column(Float)@app.on_event("startup")
async def startup():await db.set_bind('postgresql://user:password@localhost/dbname')  # 设置数据库连接await db.gino.create_all()  # 创建数据库表@app.on_event("shutdown")
async def shutdown():await db.pop_bind().close()  # 关闭数据库连接# 路由示例
@app.get("/items/{item_id}")
async def get_item(item_id: int):item = await Item.get(item_id)  # 获取单个项if item is None:raise HTTPNotFoundError(f"Item with id {item_id} not found")return item
3.2 异步查询与操作

Gino 通过使用 await 关键字支持异步数据库操作。与 Tortoise ORM 类似,所有的数据库操作(如查询、插入、更新、删除)都通过异步方式进行,这避免了阻塞应用的主线程。

@app.get("/items/")
async def get_items():items = await Item.query.gino.all()  # 获取所有项return items

通过 query.gino.all(),我们可以获取所有符合条件的记录。这是一个非阻塞的异步操作,能够高效处理大量数据。

3.3 数据事务与管理

Gino 提供了对数据库事务的支持,使得开发者能够在操作多个记录时保证数据的一致性。事务可以通过 async with 语句来管理:

@app.post("/items/")
async def create_item(name: str, price: float):async with db.transaction():  # 开始事务item = await Item.create(name=name, price=price)return item

通过 db.transaction(),Gino 会确保所有在事务内的操作要么全部成功,要么全部回滚,确保数据的一致性和可靠性。


4. 🌐 使用 asyncio 管理并发数据库连接

在高并发应用中,如何有效地管理数据库连接是一个重要的性能考虑因素。异步 ORM 本身能够帮助减少数据库操作中的阻塞,但在高并发的环境下,合理管理并发连接依然是必须考虑的问题。

4.1 使用连接池

为了避免频繁地创建和销毁数据库连接,异步 ORM 通常会使用连接池来复用数据库连接。在使用 Tortoise ORM 或 Gino ORM 时,连接池的配置通常是自动完成的,但开发者仍然可以根据需要自定义连接池的大小和其他参数。

# Tortoise ORM 示例:配置连接池
await Tortoise.init(db_url='postgresql://user:password@localhost/dbname',modules={'models': ['__main__']},connections={'default': {'pool_size': 20}}  # 设置连接池大小
)
4.2 管理并发请求

当多个请求同时进行时,使用异步 ORM 可以避免在等待数据库响应时阻塞其他请求。但为了提高效率,可以使用 asyncio 来管理并发任务,使得多个数据库操作可以并行执行。

import asyncio@app.get("/bulk_insert/")
async def bulk_insert():async def insert_item(name: str, price: float):await Item.create(name=name, price=price)# 使用 asyncio.gather() 来并行执行多个插入任务await asyncio.gather(insert_item("Item 1", 10.0),insert_item("Item 2", 20.0),insert_item("Item 3", 30.0),)return {"message": "Items inserted"}

通过 asyncio.gather(),多个数据库操作可以并行执行,从而减少了整体的响应时间。


5. 🔄 管理异步数据库事务

在涉及到多个数据库操作时,使用事务可以确保操作的原子性和一致性。FastAPI 与异步 ORM 的结合,使得事务管理变得更为简洁和高效。无论是 Tortoise ORM 还是 Gino ORM,都提供了异步事务的支持。

5.1 开始和提交事务

通过使用异步 ORM 的事务管理功能,可以确保多个操作要么一起成功,要么一起失败。以下是一个使用 Gino ORM 管理事务的示例:

@app.post("/update_item/")
async def update_item(item_id: int, price: float):async with db.transaction():  # 开始事务item = await Item.get(item_id)if item:item.price = priceawait item.update()  # 更新价格return {"message": "Item updated successfully"}

在这个例子中,db.transaction() 用来启动一个事务,所有在事务中的操作都将被提交或者回滚。事务确保了即使在多个数据库操作中出现错误,数据库状态仍然保持一致。

5.2 事务回滚

如果在事务中某个操作失败,可以手动回滚事务,保证数据库的一致性。例如:

@app.post("/create_item/")
async def create_item(name: str, price: float):async with db.transaction():try:item = await Item.create(name=name, price=price)# 如果插入过程中发生错误,事务会回滚except Exception as e:await db.transaction.rollback()  # 手动回滚raise HTTPException(status_code=400, detail="Item creation failed")return {"message": "Item created successfully"}

小结

使用异步 ORM 进行数据库操作在 FastAPI 中能够显著提升性能,尤其是在处理高并发请求时。无论是 Tortoise ORM 还是 Gino ORM,它们都提供了对异步数据库查询、事务管理以及并发操作的强大支持。通过合理配置连接池、管理异步事务和并发任务,可以确保在复杂数据库操作中仍然保持高效和稳定。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词