FastAPI中的数据库CRUD操作
本指南将介绍如何在FastAPI项目中使用SQLModel进行数据库CRUD(增删改查)操作。
Session特性
# Session的主要功能
• 管理数据库连接
• 处理事务
• 缓存查询结果
• 跟踪对象变更
• 提供CRUD操作接口
• 自动处理关系映射
CRUD类示例
from typing import Optional, List
from uuid import UUID
from sqlmodel import Session, select
from app.models.table import User
class UserCRUD:
def __init__(self, session: Session):
self.session = session
# 查询单个用户
def get_user(self, user_id: str) -> User | None:
"""根据UUID获取用户"""
return self.session.get(User, user_id)
# 条件查询
def get_user_by_phone(self, phone: str) -> Optional[User]:
"""根据手机号查询用户"""
return self.session.exec(
select(User)
.where(User.phone == phone)
).first()
# 查询列表
def get_users(self, skip: int = 0, limit: int = 100) -> List[User]:
"""获取用户列表"""
statement = select(User).offset(skip).limit(limit)
return self.session.exec(statement).all()
# 创建用户
def create_user(self, user: User) -> User:
"""创建新用户"""
self.session.add(user)
self.session.commit()
self.session.refresh(user)
return user
# 更新用户
def update_user(self, user_id: UUID, update_data: dict) -> Optional[User]:
"""更新用户信息"""
user = self.get_user(user_id)
if not user:
return None
for key, value in update_data.items():
setattr(user, key, value)
self.session.add(user)
self.session.commit()
self.session.refresh(user)
return user
# 删除用户
def delete_user(self, user_id: UUID) -> bool:
"""软删除用户"""
user = self.get_user(user_id)
if not user:
return False
user.is_deleted = True
self.session.add(user)
self.session.commit()
return True
查询操作
# 1. 直接获取
user = session.get(User, user_id)
# 2. select查询
statement = select(User).where(User.username == "test")
user = session.exec(statement).first()
# 3. 条件组合
statement = select(User).where(
User.is_active == True,
User.age >= 18
)
# 4. 排序和分页
statement = select(User)\
.order_by(User.created_at.desc())\
.offset(skip)\
.limit(limit)
# 5. 关系查询
statement = select(User, Post)\
.join(Post, User.id == Post.user_id)
最佳实践
1. Session管理:
• 使用上下文管理器(with语句)
• 及时关闭session
• 异常时回滚事务
2. 查询优化:
• 合理使用select语句
• 避免N+1查询问题
• 需要时使用join优化
3. 数据验证:
• 创建前验证数据完整性
• 更新时验证字段合法性
• 删除时检查关联依赖
4. 异常处理:
• 捕获数据库异常
• 提供友好的错误信息
• 保持数据一致性