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

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.dtcms.com/a/346826.html

相关文章:

  • 【力扣 Hot100】每日一题
  • C++之list类的代码及其逻辑详解 (中)
  • Java线程的几种状态 以及synchronized和Lock造成的线程状态差异,一篇让你搞明白
  • Linux服务器Systemctl命令详细使用指南
  • GitLab CI:安全扫描双雄 SAST vs. Dependency Scanning 该如何抉择?
  • 智慧园区人车混行误检率↓78%!陌讯动态决策算法实战解析
  • html链接的target属性
  • Win11 下卸载 Oracle11g
  • 《文字的本体论突围:从工具论到符号学革命的范式转换》
  • B.30.01.1-Java并发编程及电商场景应用
  • 算法 ---哈希表
  • 从0到1:数据库进阶之路,解锁SQL与架构的奥秘
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(6):51-60语法
  • 为什么存入数据库的中文会变成乱码
  • 从罗永浩访谈李想中学习现代家庭教育智慧
  • C++编程语言:标准库:第36章——字符串类(Bjarne Stroustrup)
  • 【秋招笔试】2025.08.23美团研发岗秋招笔试题
  • 超越基础:Glide 高级优化与自定义实战
  • 氟锑酸与氢氧化铯的反应:从化学原理到计算模拟
  • Science Robotics 通过人机交互强化学习进行精确而灵巧的机器人操作
  • 文生3D实战:用[灵龙AI API]玩转AI 3D模型 – 第7篇
  • 【C标准库】详解<stdio.h>标准输入输出库
  • 数字化转型模型工作手册
  • 一种解决使用 PotPlayer 播放 Alist 的 Webdav 时提示 无法在 FTP/WebDAV/HTTP 上修改该文件夹 的方法
  • 深入理解纹理与QtOpenGL的实现
  • 随着威胁的加剧,地方政府难以保卫关键基础设施
  • 【小沐学GIS】基于C++绘制三维数字地球Earth(osgEarth、三维瓦片地球)第十期
  • 2025年AI Agent规模化落地:企业级市场年增超60%,重构商业作业流程新路径
  • 基于Labview的旋转机械AI智能诊断系统
  • docker:compose