当前位置: 首页 > ops >正文

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 Sessionrouter = 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)

http://www.xdnf.cn/news/18511.html

相关文章:

  • 解决coze api使用coze.workflows.runs.create运行workflow返回400,但text为空
  • SEO优化工具学习——Ahrefs进行关键词调研(包含实战)
  • 市政道路井盖缺失识别误报率↓82%!陌讯多模态融合算法实战优化与边缘部署
  • ChipCamp探索系列 -- 4. Intel CPU的十八代微架构
  • 【React Native】自定义轮盘(大转盘)组件Wheel
  • 【KO】前端面试题四
  • 今日科技热点 | 量子计算突破、AI芯片与5G加速行业变革
  • PLECS 中使用 C-Script 来模拟 NTC 热敏电阻(如 NTC3950B)
  • 【K8s】整体认识K8s之Docker篇
  • 百度面试题:赛马问题
  • 嵌入式LINUX-------------数据库
  • 循环中的阻塞风险与异步线程解法
  • 搜索体验优化:ABP vNext 的查询改写(Query Rewrite)与同义词治理
  • 前端安全之XSS和CSRF
  • 鸿蒙异步处理从入门到实战:Promise、async/await、并发池、超时重试全套攻略
  • 互联网大厂Java面试实战:核心技术栈与场景化提问解析(含Spring Boot、微服务、测试框架等)
  • 量子计算驱动的Python医疗诊断编程前沿展望(中)
  • RabbitMQ面试精讲 Day 28:Docker与Kubernetes部署实践
  • Git checkout 与 Git reset 核心区别解析(分支与版本关联逻辑)
  • 如何在 Spring Boot 中安全读取账号密码等
  • 技术演进中的开发沉思-75 Linux系列:中断和与windows中断的区分
  • 【python与生活】如何自动总结视频并输出一段总结视频?
  • 基于 FastAPI 和 OpenFeature 使用 Feature Flag 控制业务功能
  • Js逆向 拼夕夕anti_content
  • 【读代码】SQLBot:开源自然语言转SQL智能助手原理与实践
  • 怎样避免游戏检测到云手机?
  • 深入浅出:图解 glibc —— 系统与应用的沉默基石
  • 【知识】Elsevier论文接收后的后续流程
  • 可预约体验 | 一句话生成全栈应用,网易CodeWave智能开发能力全新升级!
  • TDengine IDMP 应用场景:工业锅炉监控