FastAPI与SQLAlchemy数据库集成

打印 上一主题 下一主题

主题 1877|帖子 1877|积分 5631

title: FastAPI与SQLAlchemy数据库集成
date: 2025/04/17 15:33:34
updated: 2025/04/17 15:33:34
author: cmdragon
excerpt:
FastAPI与SQLAlchemy的集成通过创建假造情况、安装依靠、配置数据库连接、定义数据模型和实现路由来完成。核心模块包括数据库引擎、会话工厂和声明性基类。数据模型通过SQLAlchemy定义,路由通过FastAPI实现,支持创建和查询用户。测试接口通过curl命令举行,常见报错包括表不存在、请求体验证错误和会话不可用。高级配置涉及连接池优化和单元测试。
categories:
tags:

  • FastAPI
  • SQLAlchemy
  • 数据库集成
  • 依靠注入
  • 数据模型
  • 错误处理
  • 单元测试
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与发展
探索数千个预构建的 AI 应用,开启你的下一个伟大创意
1. FastAPI与SQLAlchemy同步数据库集成实战

1.1 项目初始化与依靠安装

在项目根目录执行以下命令创建假造情况并安装依靠:
  1. python -m venv venv
  2. source venv/bin/activate  # Linux/Mac
  3. venv\Scripts\activate.bat  # Windows
  4. pip install fastapi sqlalchemy uvicorn
复制代码
1.2 数据库配置核心模块

创建database.py文件:
  1. from sqlalchemy import create_engine
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker
  4. # 数据库连接配置(使用SQLite示例)
  5. SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
  6. # 创建数据库引擎(关闭SQLite连接池检查)
  7. engine = create_engine(
  8.     SQLALCHEMY_DATABASE_URL,
  9.     connect_args={"check_same_thread": False}
  10. )
  11. # 会话工厂(关闭自动提交,启用自动刷新)
  12. SessionLocal = sessionmaker(
  13.     autocommit=False,
  14.     autoflush=False,
  15.     bind=engine
  16. )
  17. # 声明性基类
  18. Base = declarative_base()
  19. def get_db():
  20.     """数据库会话依赖生成器"""
  21.     db = SessionLocal()
  22.     try:
  23.         yield db
  24.     finally:
  25.         db.close()
复制代码
1.3 数据模型定义

创建models.py文件:
  1. from sqlalchemy import Column, Integer, String
  2. from database import Base
  3. class User(Base):
  4.     __tablename__ = "users"
  5.     id = Column(Integer, primary_key=True, index=True)
  6.     name = Column(String(50), nullable=False)
  7.     email = Column(String(100), unique=True, index=True)
复制代码
1.4 依靠注入与路由集成

在main.py中实现:
  1. from fastapi import FastAPI, Depends
  2. from sqlalchemy.orm import Session
  3. from models import User
  4. from database import get_db, engine
  5. from pydantic import BaseModel
  6. # 初始化数据库表结构
  7. Base.metadata.create_all(bind=engine)
  8. app = FastAPI()
  9. # Pydantic请求模型
  10. class UserCreate(BaseModel):
  11.     name: str
  12.     email: str
  13. @app.post("/users/")
  14. def create_user(
  15.         user: UserCreate,
  16.         db: Session = Depends(get_db)
  17. ):
  18.     """创建用户路由"""
  19.     db_user = User(**user.dict())
  20.     db.add(db_user)
  21.     db.commit()
  22.     db.refresh(db_user)
  23.     return db_user
  24. @app.get("/users/{user_id}")
  25. def read_user(
  26.         user_id: int,
  27.         db: Session = Depends(get_db)
  28. ):
  29.     """获取用户详情"""
  30.     user = db.query(User).filter(User.id == user_id).first()
  31.     return user
复制代码
1.5 运行与测试

启动服务:
  1. uvicorn main:app --reload
复制代码
测试接口:
  1. # 创建用户
  2. curl -X POST "http://localhost:8000/users/" \
  3. -H "Content-Type: application/json" \
  4. -d '{"name":"John Doe","email":"john@example.com"}'
  5. # 查询用户
  6. curl "http://localhost:8000/users/1"
复制代码
1.6 课后Quiz

问题1: 当数据库查询返回None时,如何优化API响应?
答案解析: 推荐使用FastAPI的HTTPException返回404状态码:
  1. from fastapi import HTTPException
  2. @app.get("/users/{user_id}")
  3. def read_user(user_id: int, db: Session = Depends(get_db)):
  4.     user = db.query(User).filter(User.id == user_id).first()
  5.     if not user:
  6.         raise HTTPException(status_code=404, detail="User not found")
  7.     return user
复制代码
问题2: 如何实现数据库事务回滚?
答案解析: 在依靠注入中使用try-except块:
  1. @app.post("/orders/")
  2. def create_order(db: Session = Depends(get_db)):
  3.     try:
  4.         # 数据库操作
  5.         db.commit()
  6.     except Exception as e:
  7.         db.rollback()
  8.         raise HTTPException(status_code=500, detail=str(e))
复制代码
1.7 常见报错处理

报错1: sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: users
解决方案:

  • 确认已执行Base.metadata.create_all(bind=engine)
  • 检查数据库文件路径是否正确
  • 删除旧数据库文件重新生成
报错2: pydantic.error_wrappers.ValidationError: 1 validation error
解决方案:

  • 检查请求体是否与Pydantic模型定义匹配
  • 验证字段范例和束缚条件
  • 使用curl测试时添加-H "Content-Type: application/json"
报错3: RuntimeError: Session is not available
解决方案:

  • 确认路由函数正确使用Depends(get_db)
  • 检查数据库连接配置是否正确
  • 确保没有在路由外直接调用get_db()
1.8 高级配置技巧

连接池优化
  1. # 配置MySQL连接池示例
  2. engine = create_engine(
  3.     "mysql+pymysql://user:password@localhost/dbname",
  4.     pool_size=20,
  5.     max_overflow=0,
  6.     pool_recycle=3600
  7. )
复制代码
请求生命周期示意图
  1. 客户端请求 -> 路由处理 -> 创建数据库会话 -> 业务处理 -> 提交事务 -> 关闭会话
  2.                       │                      │
  3.                       └── 异常时回滚事务 ────┘
复制代码
单元测试配置
  1. # 测试用例示例
  2. from fastapi.testclient import TestClient
  3. def test_create_user():
  4.     client = TestClient(app)
  5.     response = client.post("/users/", json={
  6.         "name": "Test User",
  7.         "email": "test@example.com"
  8.     })
  9.     assert response.status_code == 200
  10.     assert "id" in response.json()
复制代码
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与发展,阅读完整的文章:FastAPI与SQLAlchemy数据库集成 | cmdragon's Blog
往期文章归档:

<ul>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 立即注册

本版积分规则

怀念夏天

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