FastAPI数据库集成与事务管理
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:
- 后端开发
- FastAPI
tags:
- FastAPI
- SQLAlchemy
- 数据库集成
- 事务管理
- Pydantic
- 错误处理
- 并发控制


扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
FastAPI数据库集成与事务管理完全指南
1. 环境准备与基础配置
在项目根目录创建database.py
文件:
# 安装依赖:pip install fastapi uvicorn sqlalchemy pydantic
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 配置SQLite数据库连接(生产环境建议使用PostgreSQL)
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL,
connect_args={"check_same_thread": False},
echo=True # 显示生成的SQL语句
)
# 创建数据库会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 声明性基类
Base = declarative_base()
2. 模型定义与表结构映射
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(50), nullable=False)
email = Column(String(100), unique=True)
balance = Column(Integer, default=0)
# 创建数据库表(生产环境建议使用迁移工具)
Base.metadata.create_all(bind=engine)
3. Pydantic数据模型
from pydantic import BaseModel
class UserCreate(BaseModel):
name: str
email: str
balance: int = 0
class UserResponse(BaseModel):
id: int
name: str
email: str
balance: int
class Config:
orm_mode = True # 启用ORM模式转换
4. 路由与数据库操作
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
router = APIRouter()
# 依赖项获取数据库会话
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@router.post("/users/", response_model=UserResponse)
def create_user(user: UserCreate, db: Session = Depends(get_db)):
# 显式开始事务
transaction = db.begin()
try:
db_user = User(**user.dict())
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
except Exception as e:
transaction.rollback()
raise HTTPException(
status_code=400,
detail=f"创建用户失败: {str(e)}"
)
5. 事务控制与错误处理
多操作事务示例:
def transfer_funds(sender_id: int, receiver_id: int, amount: int, db: Session):
transaction = db.begin()
try:
# 获取发送方账户
sender = db.query(User).filter(User.id == sender_id).with_for_update().first()
if not sender or sender.balance < amount:
raise ValueError("余额不足或账户不存在")
# 获取接收方账户
receiver = db.query(User).filter(User.id == receiver_id).with_for_update().first()
if not receiver:
raise ValueError("接收方账户不存在")
# 执行转账
sender.balance -= amount
receiver.balance += amount
db.commit()
return {"message": "转账成功"}
except Exception as e:
transaction.rollback()
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
往期文章归档:
- 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
- FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 ️ | cmdragon's Blog
- FastAPI 自定义参数验证器完全指南:从基础到高级实战 | cmdragon's Blog
- FastAPI 参数别名与自动文档生成完全指南:从基础到高级实战 | cmdragon's Blog
- FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战 | cmdragon's Blog
- FastAPI 表单参数与文件上传完全指南:从基础到高级实战 | cmdragon's Blog
FastAPI数据库集成与事务管理的更多相关文章
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- spring声明式事务管理总结
事务配置 首先在/WEB-INF/applicationContext.xml添加以下内容: <!-- 配置事务管理器 --> <bean id="transactionM ...
- SpringMVC+MyBatis整合——事务管理
项目一直没有做事务管理,这几天一直在想着解决这事,今天早上终于解决了.接下来直接上配置步骤. 我们项目采用的基本搭建环境:SpringMVC.MyBatis.Oracle11g.WebLogic10. ...
- Spring Boot中的事务管理
原文 http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...
- 【Java EE 学习 54】【OA项目第一天】【SSH事务管理不能回滚问题解决】【struts2流程回顾】
一.SSH整合之后事务问题和总结 1.引入问题:DAO层测试 假设将User对象设置为懒加载模式,在dao层使用load方法. 注意,注释不要放开. 使用如下的代码块进行测试: 会报错:no sess ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- Spring的事务管理
事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性(ACID) 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 ...
- ssh简化后之事务管理
为了能让大家更好的了解,所以今天跟大家分享整个项目.ps:ssh环境的搭建我就不一一讲解了,请大家参考 http://www.cnblogs.com/zczc1996/p/5842367.html. ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
- spring事务管理器设计思想(一)
在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...
随机推荐
- hello-world-python
Hello World 各位朋友们,大家好,我是jason,欢迎来到我的博客. 今天,我教大家如何使用Python来写一个简单的"Hello World"程序. 如何使用Pytho ...
- springboot logger 的配置
1.dev(开发环境)中logger配置详解 <!-- 文件输出格式 --> <property name="PATTERN" value="% ...
- DeepSeek-R1本地部署如何选择适合你的版本?看这里
DeepSeek-R1本地部署:选择最适合你的版本,轻松搞定! 关于本地部署DeepSeek-R1前期知识 如果你正在考虑将DeepSeek-R1部署到本地服务器上,了解每种类型的硬件需求是非常重要的 ...
- datawhale-leetcode打卡:038~050题
两数相加(leetcode 002) # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0 ...
- 发那科FANUC机器人M-710iC减速机维修看这几步
发那科作为全球知名的工业机器人制造商,其M-710iC型号机器人在工业界享有盛誉.然而,即便是最顶尖的设备也难免会遇到维修问题,其中四轴传动齿轮箱的维修尤为关键.本文将深入探讨发那科FANUC机器人 ...
- 反范式设计,冗余用户姓名,修改用户姓名后,业务表同步更新 -- MySQL 存储过程
反范式设计,冗余用户姓名,通过存储过程进行业务表的同步更新. 所有的表,在创建的时候,都加了创建人.修改人的字段..用户姓名发生变化时,要将所有的表都更新一遍. 创建存储过程 MySQL CREATE ...
- ffmpeg-5.0-essentials_build 下载
ffmpeg-5.0-essentials_build下载放到蓝奏里了 https://wwz.lanzoub.com/if9xq02pttkb密码:ee8i
- 八米云-N1盒子、S905系列机顶盒等设备-小白保姆式超详细刷机教程
线刷准备 这里以魔百盒CM211-1为例,本次刷机用到的零碎工具比较多,不过都是常见刚需设备,大家可以按照清单核对一下. 目前只支持S905 L3.L3a.L2 系列的各种盒子 机顶盒本体 电脑一台 ...
- win11 - 设置FTP服务详细教程
题记部分 一.开启FTP服务 https://blog.csdn.net/qq_42142258/article/details/131725760 二.配置FTP服务 https://blog.cs ...
- 李沐动手学深度学习V2-chapter_convolutional-modern
李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=3 ...