FastAPI数据库集成与事务管理

打印 上一主题 下一主题

主题 1520|帖子 1520|积分 4560

title: FastAPI数据库集成与事务管理
date: 2025/04/18 00:15:34
updated: 2025/04/18 00:15:34
author: cmdragon
excerpt:
FastAPI与SQLAlchemy集成指南:首先配置SQLite数据库毗连,创建会话工厂和声明性基类。界说用户模子并映射表布局,使用Pydantic进行数据验证。通过依靠项获取数据库会话,实现用户创建和转账功能。事务控制通过显式开始事务和错误处理确保数据一致性。常见标题包括422验证错误、500服务器错误和完整性错误,需检查哀求体、数据库毗连和束缚。课后Quiz解答事务回滚、SQL注入防护和并发写操作处理。
categories:
tags:

  • FastAPI
  • SQLAlchemy
  • 数据库集成
  • 事务管理
  • Pydantic
  • 错误处理
  • 并发控制
扫描二维码关注大概微信搜一搜:编程智域 前端至全栈交换与发展
探索数千个预构建的 AI 应用,开启你的下一个巨大创意
FastAPI数据库集成与事务管理完全指南

1. 环境预备与底子配置

在项目根目录创建database.py文件:
  1. # 安装依赖:pip install fastapi uvicorn sqlalchemy pydantic
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.ext.declarative import declarative_base
  4. from sqlalchemy.orm import sessionmaker
  5. # 配置SQLite数据库连接(生产环境建议使用PostgreSQL)
  6. SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
  7. engine = create_engine(
  8.     SQLALCHEMY_DATABASE_URL,
  9.     connect_args={"check_same_thread": False},
  10.     echo=True  # 显示生成的SQL语句
  11. )
  12. # 创建数据库会话工厂
  13. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  14. # 声明性基类
  15. Base = declarative_base()
复制代码
2. 模子界说与表布局映射
  1. from sqlalchemy import Column, Integer, String
  2. class User(Base):
  3.     __tablename__ = "users"
  4.     id = Column(Integer, primary_key=True, index=True)
  5.     name = Column(String(50), nullable=False)
  6.     email = Column(String(100), unique=True)
  7.     balance = Column(Integer, default=0)
  8. # 创建数据库表(生产环境建议使用迁移工具)
  9. Base.metadata.create_all(bind=engine)
复制代码
3. Pydantic数据模子
  1. from pydantic import BaseModel
  2. class UserCreate(BaseModel):
  3.     name: str
  4.     email: str
  5.     balance: int = 0
  6. class UserResponse(BaseModel):
  7.     id: int
  8.     name: str
  9.     email: str
  10.     balance: int
  11.     class Config:
  12.         orm_mode = True  # 启用ORM模式转换
复制代码
4. 路由与数据库操作
  1. from fastapi import APIRouter, Depends, HTTPException
  2. from sqlalchemy.orm import Session
  3. router = APIRouter()
  4. # 依赖项获取数据库会话
  5. def get_db():
  6.     db = SessionLocal()
  7.     try:
  8.         yield db
  9.     finally:
  10.         db.close()
  11. @router.post("/users/", response_model=UserResponse)
  12. def create_user(user: UserCreate, db: Session = Depends(get_db)):
  13.     # 显式开始事务
  14.     transaction = db.begin()
  15.     try:
  16.         db_user = User(**user.dict())
  17.         db.add(db_user)
  18.         db.commit()
  19.         db.refresh(db_user)
  20.         return db_user
  21.     except Exception as e:
  22.         transaction.rollback()
  23.         raise HTTPException(
  24.             status_code=400,
  25.             detail=f"创建用户失败: {str(e)}"
  26.         )
复制代码
5. 事务控制与错误处理

多操作事务示例:
  1. def transfer_funds(sender_id: int, receiver_id: int, amount: int, db: Session):
  2.     transaction = db.begin()
  3.     try:
  4.         # 获取发送方账户
  5.         sender = db.query(User).filter(User.id == sender_id).with_for_update().first()
  6.         if not sender or sender.balance < amount:
  7.             raise ValueError("余额不足或账户不存在")
  8.         # 获取接收方账户
  9.         receiver = db.query(User).filter(User.id == receiver_id).with_for_update().first()
  10.         if not receiver:
  11.             raise ValueError("接收方账户不存在")
  12.         # 执行转账
  13.         sender.balance -= amount
  14.         receiver.balance += amount
  15.         db.commit()
  16.         return {"message": "转账成功"}
  17.     except Exception as e:
  18.         transaction.rollback()
  19.         raise HTTPException(status_code=400, detail=str(e))
复制代码
6. 常见报错解决方案

标题1:422 Validation Error

  • 现象:哀求参数验证失败
  • 解决方法:

    • 检查哀求体是否符合Pydantic模子界说
    • 使用Swagger UI测试接口
    • 查看返回的detail字段中的具体错误信息

标题2:500 Internal Server Error

  • 现象:数据库毗连失败
  • 解决方法:

    • 检查数据库URL格式是否正确
    • 验证数据库服务是否正常运行
    • 检查数据库用户权限设置

标题3:IntegrityError (sqlalchemy.exc.IntegrityError)

  • 现象:违反数据库束缚
  • 解决方法:

    • 检查唯一性束缚字段(如email)
    • 验证外键关联是否存在
    • 确保NOT NULL字段都有值

7. 课后Quiz

Q1:以下哪种情况会导致事务自动回滚?
A) 代码中显式调用commit()
B) 发生未捕捉的异常
C) 使用with_for_update()
D) 调用refresh()方法
正确答案:B
剖析:当数据库操作过程中出现未捕捉的异常时,SQLAlchemy会自动回滚当前事务,保证数据一致性。
Q2:如何防止SQL注入攻击?
A) 使用字符串拼接查询
B) 始终使用ORM查询方法
C) 手动转义特殊字符
D) 关闭数据库日志
正确答案:B
剖析:SQLAlchemy的ORM系统会自动处理参数化查询,避免直接拼接SQL语句,从根本上防止SQL注入。
Q3:什么情况下需要使用with_for_update()?
A) 需要提高查询性能
B) 处理并发写操作
C) 创建数据库索引
D) 执行批量插入
正确答案:B
剖析:with_for_update()在事务中锁定查询行,防止其他事务修改,用于处理需要保证数据一致性的并发写操作场景。
通过本文的学习,您应该已经掌握FastAPI集成SQLAlchemy的焦点方法,理解事务控制原理,并可以或许处理常见的数据库操作标题。建议在现实项目中结合Alembic进行数据库迁移管理,并配置毗连池优化性能。
余下文章内容请点击跳转至 个人博客页面 大概 扫码关注大概微信搜一搜:编程智域 前端至全栈交换与发展,阅读完整的文章:FastAPI数据库集成与事务管理 | cmdragon's Blog
往期文章归档:

<ul>FastAPI与SQLAlchemy数据库集成 | cmdragon's Blog
FastAPI与SQLAlchemy数据库集成与CRUD操作 | cmdragon's Blog
FastAPI与SQLAlchemy同步数据库集成 | cmdragon's Blog
SQLAlchemy 焦点概念与同步引擎配置详解 | cmdragon's Blog
FastAPI依靠注入性能优化策略 | cmdragon's Blog
FastAPI安全认证中的依靠组合 | cmdragon's Blog
FastAPI依靠注入系统及调试技巧 | cmdragon's Blog
FastAPI依靠覆盖与测试环境模仿 | cmdragon's Blog
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 立即注册

本版积分规则

灌篮少年

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