IT评测·应用市场-qidao123.com技术社区

标题: FastAPI与SQLAlchemy同步数据库集成 [打印本页]

作者: 曂沅仴駦    时间: 2025-4-15 01:56
标题: FastAPI与SQLAlchemy同步数据库集成
title: FastAPI与SQLAlchemy同步数据库集成
date: 2025/04/15 01:27:37
updated: 2025/04/15 01:27:37
author: cmdragon
excerpt:
FastAPI与SQLAlchemy集成通过ORM框架实现Python类与数据库表的双向转换。SQLAlchemy提供Core层和ORM层,FastAPI选择ORM层以符合Pythonic风格。声明式模型通过declarative_base()创建基类,界说数据库结构。数据库引擎通过毗连字符串设置,会话管理机制确保操作生命周期。完整示例展示了用户管理API的实现,包括创建和查询接口。常见问题涉及会话报错和数据验证错误,解决方案包括检查表结构和验证请求格式。高级设置本领包括复合索引优化和事务管理。
categories:
tags:
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
探索数千个预构建的 AI 应用,开启你的下一个伟大创意
1. FastAPI与SQLAlchemy同步数据库集成基础

1.1 ORM框架焦点原理

ORM(Object-Relational Mapping)相称于数据库世界的翻译官,将Python类对象与数据库表进行双向转换。就像邮局工作职员把信件分拣到不同国家的邮筒,ORM自动将类属性映射为表字段,将对象操作转换为SQL语句。
SQLAlchemy作为Python最强大的ORM工具,提供两种模式:
FastAPI选择ORM层实现数据库集成,因其符合Pythonic编程风格,且能与Pydantic美满配合。
1.2 声明式模型界说

声明式模型就像建筑蓝图,通过类界说形貌数据库结构。我们利用declarative_base()创建基类,所有模型继承这个基类得到映射能力。
  1. # 安装必要库(运行环境要求Python3.7+)
  2. # pip install fastapi sqlalchemy pydantic uvicorn
  3. from sqlalchemy import create_engine, Column, Integer, String, DateTime
  4. from sqlalchemy.ext.declarative import declarative_base
  5. from datetime import datetime
  6. # 创建基类(相当于所有模型的DNA)
  7. Base = declarative_base()
  8. class User(Base):
  9.     __tablename__ = 'users'  # 数据库表名
  10.     id = Column(Integer, primary_key=True, index=True)
  11.     username = Column(String(50), unique=True, nullable=False)
  12.     email = Column(String(100), index=True)
  13.     created_at = Column(DateTime, default=datetime.utcnow)
  14.     def __repr__(self):
  15.         return f"<User {self.username}>"
复制代码
字段范例映射关系:
Python范例SQL范例说明IntegerINTEGER32位整数String(50)VARCHAR(50)变长字符串,需指定长度DateTimeDATETIME日期时间范例BooleanBOOLEAN布尔值FloatFLOAT浮点数1.3 数据库毗连设置

数据库引擎是ORM与数据库的通信枢纽,毗连字符串格式:dialect+driver://user:password@host:port/dbname
  1. # 创建数据库引擎(同步模式)
  2. DATABASE_URL = "sqlite:///./test.db"
  3. engine = create_engine(
  4.     DATABASE_URL,
  5.     connect_args={"check_same_thread": False}  # 仅SQLite需要
  6. )
  7. # 创建所有表结构(相当于根据蓝图盖房子)
  8. Base.metadata.create_all(bind=engine)
复制代码
1.4 会话管理机制

数据库会话(Session)是工作单位模式的焦点,管理所有数据库操作的生命周期。就像银行柜台办理业务,所有操作在窗口打开时开始,关闭时统一提交。
  1. from sqlalchemy.orm import sessionmaker
  2. # 创建会话工厂(相当于银行窗口)
  3. SessionLocal = sessionmaker(
  4.     autocommit=False,
  5.     autoflush=False,
  6.     bind=engine
  7. )
  8. # 依赖项注入(FastAPI最佳实践)
  9. def get_db():
  10.     db = SessionLocal()
  11.     try:
  12.         yield db
  13.     finally:
  14.         db.close()
复制代码
2. 完整集成示例

2.1 用户管理API实现
  1. from fastapi import FastAPI, Depends, HTTPException
  2. from pydantic import BaseModel
  3. from typing import Optional
  4. app = FastAPI()
  5. # Pydantic模型(数据验证层)
  6. class UserCreate(BaseModel):
  7.     username: str
  8.     email: Optional[str] = None
  9. class UserResponse(UserCreate):
  10.     id: int
  11.     created_at: datetime
  12. # 创建用户端点
  13. @app.post("/users/", response_model=UserResponse)
  14. def create_user(user: UserCreate, db: Session = Depends(get_db)):
  15.     # 检查用户名是否重复
  16.     db_user = db.query(User).filter(User.username == user.username).first()
  17.     if db_user:
  18.         raise HTTPException(status_code=400, detail="Username already registered")
  19.     # 创建ORM对象
  20.     db_user = User(**user.dict())
  21.     db.add(db_user)
  22.     db.commit()
  23.     db.refresh(db_user)
  24.     return db_user
复制代码
2.2 查询接口实现
  1. @app.get("/users/{user_id}", response_model=UserResponse)
  2. def read_user(user_id: int, db: Session = Depends(get_db)):
  3.     user = db.query(User).filter(User.id == user_id).first()
  4.     if not user:
  5.         raise HTTPException(status_code=404, detail="User not found")
  6.     return user
复制代码
3. 常见问题解决方案

3.1 数据库会话报错处理惩罚

报错信息:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table
解决方案
3.2 数据验证错误

报错信息:422 Unprocessable Entity,请求体验证失败
排查步骤
课后Quiz

问题1:当需要添加用户年龄字段时,应怎样修改模型?
A. 同时在SQLAlchemy模型和Pydantic模型中添加字段
B. 只需修改SQLAlchemy模型
C. 需要同时修改SQLAlchemy模型和Pydantic模型,并实行数据库迁徙
答案:C
剖析:SQLAlchemy模型负责数据库结构,Pydantic模型负责数据验证。新增字段需两者同时修改,并通过迁徙工具更新数据库表结构。
问题2:怎样防止用户注册时邮箱重复?
A. 在数据库层面设置唯一约束
B. 在业务逻辑中先查询是否存在
C. 同时利用A和B
答案:C
剖析:数据库唯一约束是最终保障,业务逻辑中的检查能提前发现错误,提拔系统友好性。两者联合是最佳实践。
4. 高级设置本领

4.1 复合索引优化
  1. from sqlalchemy import Index
  2. class Product(Base):
  3.     __tablename__ = 'products'
  4.     id = Column(Integer, primary_key=True)
  5.     name = Column(String(100))
  6.     category = Column(String(50))
  7.     price = Column(Integer)
  8. # 创建复合索引(名称+类别)
  9. __table_args__ = (
  10.     Index('idx_name_category', 'name', 'category'),
  11. )
复制代码
4.2 事务管理示例
  1. def transfer_funds(sender_id, receiver_id, amount, db):
  2.     try:
  3.         sender = db.query(User).get(sender_id)
  4.         receiver = db.query(User).get(receiver_id)
  5.         if sender.balance < amount:
  6.             raise ValueError("Insufficient balance")
  7.         sender.balance -= amount
  8.         receiver.balance += amount
  9.         db.commit()
  10.     except:
  11.         db.rollback()
  12.         raise
复制代码
运行服务:
  1. uvicorn main:app --reload
复制代码
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:FastAPI与SQLAlchemy同步数据库集成 | cmdragon's Blog
往期文章归档:

<ul>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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4