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)
相关推荐
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
曲幽1 天前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
曲幽2 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
曲幽3 天前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama
闲云一鹤4 天前
Python 入门(二)- 使用 FastAPI 快速生成后端 API 接口
python·fastapi
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
曲幽4 天前
FastAPI + Ollama 实战:搭一个能查天气的AI助手
python·ai·lora·torch·fastapi·web·model·ollama·weatherapi
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript