FastAPI + SQLAlchemy 数据库对象转字典

复制代码
def object_as_dict_list(db_list):
    return [{**object_as_dict(item)} for item in db_list]

def object_as_dict(obj):
    return {column.name: getattr(obj, column.name) for column in obj.__table__.columns}

1. object_as_dict(obj) 函数(基础转换器)

复制代码
def object_as_dict(obj):
    return {column.name: getattr(obj, column.name) for column in obj.__table__.columns}
复制代码
工作原理:
  • obj.__table__.columns:获取 SQLAlchemy 模型的所有列定义

  • for column in obj.__table__.columns:遍历每一列

  • column.name:获取列的名称(字段名)

  • getattr(obj, column.name):获取对象在该字段上的值

  • {column.name: getattr(obj, column.name) for ...}:字典推导式,创建字段名到值的映射

示例:

假设有一个 User 模型:

复制代码
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)

调用 object_as_dict(user_obj) 会返回:

{'id': 1, 'name': 'Alice', 'email': 'alice@example.com'}

2. object_as_dict_list(db_list) 函数(批量转换器)

复制代码
def object_as_dict_list(db_list):
    return [{**object_as_dict(item)} for item in db_list]

工作原理:

  • for item in db_list:遍历数据库对象列表中的每个对象

  • object_as_dict(item):将每个对象转换为字典

  • {**object_as_dict(item)}:使用字典解包创建新字典

  • [...]:列表推导式,将所有结果收集到新列表中

示例:

输入:[<User id=1>, <User id=2>]

输出:

复制代码
[
    {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'},
    {'id': 2, 'name': 'Bob', 'email': 'bob@example.com'}
]

为什么需要 {**dict} 解包操作?

安全性考虑:创建副本避免意外修改

复制代码
# 没有解包的情况(潜在风险)
def risky_object_as_dict_list(db_list):
    return [object_as_dict(item) for item in db_list]

result = risky_object_as_dict_list(users)
result[0]['name'] = 'Modified'  # 这可能影响原始对象!

# 使用解包的情况(安全)
def safe_object_as_dict_list(db_list):
    return [{**object_as_dict(item)} for item in db_list]

result = safe_object_as_dict_list(users)  
result[0]['name'] = 'Modified'  # 安全,不影响原始对象
复制代码

在 FastAPI 路由中使用:

复制代码
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

router = APIRouter()

@router.get("/users")
async def get_users(db: Session = Depends(get_db)):
    # 查询数据库获取对象列表
    users = db.query(User).all()
    
    # 转换为字典列表(适合JSON响应)
    return object_as_dict_list(users)

@router.get("/users/{user_id}")  
async def get_user(user_id: int, db: Session = Depends(get_db)):
    # 查询单个对象
    user = db.query(User).filter(User.id == user_id).first()
    
    # 转换为字典
    return object_as_dict(user)
相关推荐
@insist1231 小时前
系统集成项目管理工程师-信息和文档管理
网络·数据库·软考·系统集成项目管理工程师·软考中项·软件水平考试
残 风3 小时前
PostgreSQL 存储机制详解
数据库·postgresql·开源·数据库开发
JacksonMx3 小时前
Java CompletableFuture 异步编程实战:从入门到架构师避坑指南
linux·数据库·python
tachibana23 小时前
性能指标的口径选择
数据库·人工智能·架构·大模型·llm
机器人梦想家4 小时前
具身机器人视觉服务的异步回调与并发控制
数据库·算法·机器人
小妖同学学AI5 小时前
开源向量数据库的王者:Milvus 深度解析,专为 AI 应用打造的云原生搜索引擎!
数据库·开源·milvus
l1258655 小时前
# RAG上线评估指标体系:六大核心指标与压测实战全解析
数据库·人工智能·python·mysql·langchain·milvus
一只鹿鹿鹿6 小时前
数据资产管理解决方案(Word文件)
大数据·数据库·安全·web安全·系统安全
2401_894915536 小时前
Geo 优化源码部署实战:环境配置、参数调优完整指南
运维·服务器·数据库·tcp/ip·安全
FfHUCisI6 小时前
Golang database/sql 标准库基础
数据库·sql·golang