FastAPI中的依赖注入与数据库事务管理

打印 上一主题 下一主题

主题 1656|帖子 1656|积分 4968

title: FastAPI中的依赖注入与数据库事务管理
date: 2025/04/09 00:10:29
updated: 2025/04/09 00:10:29
author: cmdragon
excerpt:
FastAPI中使用依赖注入和SQLAlchemy进行数据库会话封装的方法,提供了三种事务管理模式的实现:主动事务模式、手动控制模式和装饰器模式。通过代码示例展示了如何创建用户注册功能,并处置惩罚事务和错误。强调了使用参数化查询防止SQL注入攻击的重要性,并提供了常见报错的解决方案,包括检查数据库连接参数、管剖析话生命周期和调整连接池设置。
categories:

  • 后端开辟
  • FastAPI
tags:

  • 依赖注入
  • 数据库会话管理
  • 事务管理
  • FastAPI
  • SQLAlchemy
  • 异步编程
  • SQL注入防护
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与发展
探索数千个预构建的 AI 应用,开启你的下一个伟大创意

  • 依赖注入基础与数据库会话封装
    (代码示例运行环境:Python 3.8+,需安装fastapi, uvicorn, sqlalchemy, asyncpg)
  1. from fastapi import Depends, FastAPI
  2. from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
  3. from sqlalchemy.orm import sessionmaker
  4. # 初始化数据库连接(使用异步引擎)
  5. DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
  6. engine = create_async_engine(DATABASE_URL, echo=True)
  7. async_session_maker = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
  8. # 封装数据库会话依赖
  9. async def get_db() -> AsyncSession:
  10.     """
  11.     生成器函数创建数据库会话上下文
  12.     使用yield代替return实现资源自动释放
  13.     会话自动关闭机制保证连接池回收
  14.     """
  15.     async with async_session_maker() as session:
  16.         try:
  17.             yield session
  18.         finally:
  19.             await session.close()
  20. app = FastAPI()
  21. @app.post("/users/")
  22. async def create_user(
  23.         name: str,
  24.         session: AsyncSession = Depends(get_db)
  25. ):
  26.     """
  27.     路由函数通过Depends自动获取数据库会话
  28.     事务管理需要在业务逻辑中显式控制
  29.     注意异步await关键字的正确使用
  30.     """
  31.     from sqlalchemy import text
  32.     try:
  33.         # 执行原生SQL示例(实际建议使用ORM)
  34.         await session.execute(
  35.             text("INSERT INTO users (name) VALUES (:name)"),
  36.             {"name": name}
  37.         )
  38.         await session.commit()
  39.         return {"status": "created"}
  40.     except Exception as e:
  41.         await session.rollback()
  42.         raise HTTPException(500, str(e))
复制代码

  • 事务管理的三种实现模式
(1)主动事务模式(适合简单操作):
  1. from fastapi import Depends
  2. from databases import Database
  3. async def transaction_wrapper(db: Database = Depends(get_db)):
  4.     async with db.transaction():
  5.         yield
复制代码
(2)手动控制模式(复杂业务场景):
  1. @app.post("/orders/")
  2. async def create_order(
  3.         user_id: int,
  4.         db: AsyncSession = Depends(get_db)
  5. ):
  6.     try:
  7.         await db.begin()
  8.         # 执行多个数据库操作
  9.         await db.commit()
  10.     except SQLAlchemyError:
  11.         await db.rollback()
  12.         raise
复制代码
(3)装饰器模式(代码复用最佳实践):
  1. from contextlib import asynccontextmanager
  2. @asynccontextmanager
  3. async def managed_transaction(db: AsyncSession):
  4.     try:
  5.         yield
  6.         await db.commit()
  7.     except Exception:
  8.         await db.rollback()
  9.         raise
  10. # 在路由中使用
  11. async def create_order(db: AsyncSession = Depends(get_db)):
  12.     async with managed_transaction(db):
  13. # 业务逻辑代码
复制代码

  • 完整案例:用户注册连带创建档案
    (包罗事务管理和错误处置惩罚的最佳实践)
  1. from sqlalchemy import insert
  2. from pydantic import BaseModel
  3. class UserCreate(BaseModel):
  4.     username: str
  5.     email: str
  6.     profile: dict
  7. @app.post("/register/")
  8. async def register_user(
  9.         user_data: UserCreate,
  10.         db: AsyncSession = Depends(get_db)
  11. ):
  12.     async with db.begin():
  13.         try:
  14.             # 插入用户主表
  15.             user_result = await db.execute(
  16.                 insert(users_table).values(
  17.                     username=user_data.username,
  18.                     email=user_data.email
  19.                 ).returning(users_table.c.id)
  20.             )
  21.             user_id = user_result.scalar()
  22.             # 插入档案子表
  23.             await db.execute(
  24.                 insert(profiles_table).values(
  25.                     user_id=user_id,
  26.                     **user_data.profile
  27.                 )
  28.             )
  29.             return {"user_id": user_id}
  30.         except IntegrityError as e:
  31.             await db.rollback()
  32.             if "unique constraint" in str(e):
  33.                 raise HTTPException(400, "Username already exists")
  34.             raise HTTPException(500, "Database error")
复制代码
课后Quiz:
Q1:使用原生SQL查询时,如何防止SQL注入攻击?
A) 直接拼接字符串
B) 使用参数化查询
C) 过滤特殊字符
D) 使用ORM主动处置惩罚
正确答案:B
剖析:参数化查询通过将用户输入与SQL语句分离的方式,从根本上阻止注入攻击。示例中的text()
函数配合参数字典即为正确做法。即使用ORM,也必要避免直接拼接查询字符串。
常见报错解决方案:
错误现象:
sqlalchemy.exc.InterfaceError: (sqlalchemy.dialects.postgresql.asyncpg.InterfaceError)
原因分析:

  • 数据库连接参数配置错误
  • 连接池耗尽未正确释放
  • 异步上下文管理不妥
解决步骤:

  • 检查DATABASE_URL格式:postgresql+asyncpg://
  • 确保数据库服务正常运行
  • 在依赖项中正确使用async with管剖析话生命周期
  • 调整连接池设置:
  1. engine = create_async_engine(
  2.     DATABASE_URL,
  3.     pool_size=20,
  4.     max_overflow=10,
  5.     pool_timeout=30
  6. )
复制代码
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与发展,阅读完整的文章:FastAPI中的依赖注入与数据库事务管理 | cmdragon's Blog
往期文章归档:

<ul>FastAPI依赖注入作用域与生命周期控制 | cmdragon's Blog
FastAPI依赖注入实践:工厂模式与实例复用的优化战略 | cmdragon's Blog
FastAPI依赖注入:链式调用与多级参数传递 | cmdragon's Blog
FastAPI依赖注入:从基础概念到应用 | cmdragon's Blog
FastAPI中实现动态条件必填字段的实践 | cmdragon's Blog
FastAPI中Pydantic异步分布式唯一性校验 | cmdragon's Blog
掌握FastAPI与Pydantic的跨字段验证技巧 | cmdragon's Blog
FastAPI中的Pydantic密码验证机制与实现 | cmdragon's Blog
深入掌握FastAPI与OpenAPI规范的高级适配技巧 | cmdragon's Blog
Pydantic字段元数据指南:从基础到企业级文档增强 | cmdragon's Blog
Pydantic Schema生成指南:自定义JSON Schema | cmdragon's Blog
Pydantic递归模子深度校验36计:从无限嵌套到亿级数据的优化法则 | cmdragon's Blog
Pydantic异步校验器深:构建高并发验证系统 | cmdragon's Blog
Pydantic根校验器:构建跨字段验证系统 | cmdragon's Blog
Pydantic配置继承抽象基类模式 | cmdragon's Blog
Pydantic多态模子:用鉴别器构建类型安全的API接口 | cmdragon's Blog
FastAPI性能优化指南:参数剖析与惰性加载 | cmdragon's Blog
FastAPI依赖注入:参数共享与逻辑复用 | cmdragon's Blog
FastAPI安全防护指南:构建坚如盘石的参数处置惩罚体系 | cmdragon's Blog
FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 | cmdragon's Blog
FastAPI 焦点机制:分页参数的实现与最佳实践 | cmdragon's Blog
<a href="https://blog.cmdragon.cn/posts/615a966b68d9/" target="_blank" rel="noopener nofollow">FastAPI 错误处置惩罚与自定义错误消息完全指南:构建健壮的 API 应用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表