SQLAlchemy 常见问题笔记

文章目录

    • SQLAlchemy Session对象如何操作数据库
    • SQLAlchemy非序列化对象如何返回
      • 1.问题分析
      • 2.解决方案
        • 方法1:使用 Pydantic 响应模型(推荐)
        • 方法2:手动转换为字典(简单快速)
        • 方法3:使用 SQLAlchemy 的 as_dict 方法(需在模型中添加)
      • 3.完整代码示例
      • 4.最佳实践建议
  • 路由注册

SQLAlchemy Session对象如何操作数据库

  1. 模型元数据关联

    • 当创建模型实例时,SQLAlchemy 知道这个对象对应 __tablename__ 指定的表
    • 所有字段映射到表的列是通过类属性定义的
  2. 会话操作

    • db.add(record):将对象加入会话的"待处理"列表

    • db.commit():生成并执行SQL语句:

      sql

      INSERT INTO user_files (id, name, type, ...) 
      VALUES (?, ?, ?, ...)
      
  3. 表名确定时机

    • 开发时:通过模型的 __tablename__ 静态定义
    • 运行时:SQLAlchemy 通过对象的类信息确定目标表
  4. 为什么不需要显式指定表名

    1. ORM 的核心特性

      • 对象关系映射自动处理表关联
      • 每个模型类隐式绑定到特定表
    2. 会话的通用性

      • 同一个 db 会话可操作多个模型
      • 操作表取决于操作的模型对象类型

总结:

元素作用表名确定方式
model模型类定义表结构通过 __tablename__ 类属性
record 实例携带数据实例所属类决定目标表
db.add()加入会话根据实例类型确定表
db.commit()执行操作生成对应表的SQL语句

这种设计模式遵循SQLAlchemy的"Unit of Work"模式,开发者只需操作Python对象,ORM自动处理表映射和SQL生成。

SQLAlchemy非序列化对象如何返回

1.问题分析

  1. SQLAlchemy 对象不是可序列化类型

    • 开发时创建的模型是 SQLAlchemy 模型实例
    • FastAPI 的 JSONResponse 需要可序列化为 JSON 的 Python 基本类型(dict, list, str等)
  2. __dict__ 包含内部属性

    • 直接使用 db_user.__dict__ 会包含 SQLAlchemy 内部属性(如 _sa_instance_state
    • 这些特殊属性无法被 JSON 序列化

2.解决方案

方法1:使用 Pydantic 响应模型(推荐)
from pydantic import BaseModel# 定义响应模型
class UserResponse(BaseModel):id: strusername: str@router.get("/createUser")
def create_user(db:Session = Depends(get_db)):try:# ...创建用户的代码...db.commit()# 使用 Pydantic 模型转换response_data = UserResponse(id=db_user.id,username=db_user.username)return success_response(200, "创建成功", response_data.dict())except Exception as e:# ...
方法2:手动转换为字典(简单快速)
@router.get("/createUser")
def create_user(db: Session = Depends(get_db)):try:# ...创建用户的代码...db.commit()# 手动构建可序列化的字典user_data = {"id": db_user.id,"username": db_user.username}return success_response(200, "创建成功", user_data)except Exception as e:# ...
方法3:使用 SQLAlchemy 的 as_dict 方法(需在模型中添加)
# 在 User 模型类中添加
class User(Base):# ... 原有字段定义 ...def as_dict(self):return {c.key: getattr(self, c.key) for c in inspect(self).mapper.column_attrs}# 在路由中使用
@router.get("/createUser")
def create_user(db: Session = Depends(get_db)):try:# ...创建用户的代码...db.commit()return success_response(200, "创建成功", db_user.as_dict())except Exception as e:# ...

FastAPI 内部尝试序列化时:

  1. 检测到 db_user 不是基本类型
  2. 尝试调用 db_user.__dict__
  3. 发现 __dict__ 包含不可序列化的 _sa_instance_state 属性
  4. 最终返回空字典 {} 作为安全处理

3.完整代码示例

@router.get("/createUser")
def create_user(db: Session = Depends(get_db)):try:user = UserCreate(username="111")db_user = User()db_user.id = uuid.uuid1().hexdb_user.username = user.usernamedb.add(db_user)db.commit()# 解决方案:转换为可序列化的字典user_data = {"id": db_user.id,"username": db_user.username,# 添加其他需要返回的字段}return success_response(200, "创建成功", user_data)except Exception as e:db.rollback()return error_response(500, message="用户名至少3个字符")

4.最佳实践建议

  1. 始终使用 Pydantic 模型定义响应结构
  2. 在数据库操作后立即转换为响应模型
  3. 避免直接返回 ORM 对象,因为它们:
    • 包含数据库会话状态信息
    • 可能导致意外数据暴露
    • 难以控制序列化行为
{"code": 200,"message": "创建成功","data": {"id": "","username": ""}
}

路由注册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89704.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell脚本-uniq工具

一、前言在 Linux/Unix 系统中,uniq 是一个非常实用的文本处理命令,用于对重复的行进行统计、去重和筛选。它通常与 sort 搭配使用,以实现高效的文本数据清洗与统计分析。无论是做日志分析、访问频率统计,还是编写自动化脚本&…

氛围编码(Vice Coding)的工具选择方式

一、前言 在写作过程中,我受益于若干优秀的博客分享,它们给予我宝贵的启发: 《5分钟选对AI编辑器,每天节省2小时开发时间让你早下班!》:https://mp.weixin.qq.com/s/f0Zm3uPTcNz30oxKwf1OQQ 二、AI编辑的…

[硬件电路-57]:根据电子元器件的受控程度,可以把电子元器件分为:不受控、半受控、完全受控三种大类

根据电子元器件的受控程度,可将其分为不受控、半受控、完全受控三大类。这种分类基于元器件的工作状态是否需要外部信号(如电压、电流、光、热等)的主动调控,以及调控的精确性和灵活性。以下是具体分类及实例说明:一、…

基于Pytorch的人脸识别程序

人脸识别原理详解人脸识别是模式识别和计算机视觉领域的重要研究方向,其目标是从图像或视频中识别出特定个体的身份。现代人脸识别技术主要基于深度学习方法,特别是卷积神经网络 (CNN),下面从多个维度详细解析其原理:1. 人脸识别的…

ubuntu 开启ssh踩坑之旅

文章目录确认当前用户为普通用户 or root命令使用ssh还是sshd服务名称的由来apt update和apt upgrade的关系apt upgrade报错:“E: 您在 /var/cache/apt/archives/ 上没有足够的可用空间”开启ssh步骤错误排查查看日志修改sshd_config文件允许防火墙通过22端口确认当…

力扣:动态规划java

sub07 线性DP - O(1) 状态转移2_哔哩哔哩_bilibili 跳楼梯 class Solution {public int climbStairs(int n) {if (n < 1) {return 1; // 处理边界情况}int[] dp new int[n 1]; // 创建长度为n1的数组&#xff0c;比方说跳二级楼梯dp[0] 1; // 初始值设定dp[1] 1;for (…

React Native打开相册选择图片或拍照 -- react-native-image-picker

官方文档&#xff1a;https://www.npmjs.com/package/react-native-image-picker 场景&#xff1a;点击按钮打开相册选择图片或者点击按钮拍照 import { launchCamera, launchImageLibrary } from react-native-image-picker;// ... <TouchableOpacityactiveOpacity{0.7}o…

USRP B210生成信号最大带宽测试之Frank

书接上文&#xff1a; USRP B210生成LFM,SFM,BPSK,Frank信号的最大带宽测试&#xff08;一&#xff09; USRP B210生成信号最大带宽测试&#xff08;二&#xff09;SFM USRP B210生成信号最大带宽测试&#xff08;三&#xff09;LFM USRP B210生成信号最大带宽测试之BPSK …

pages.json页面路由中,globalStyle的各个属性

欢迎来到我的UniApp技术专栏&#xff01;&#x1f389; 在这里&#xff0c;我将与大家分享关于UniApp开发的实用技巧、最佳实践和项目经验。 专栏特色&#xff1a; &#x1f4f1; 跨平台开发一站式解决方案 &#x1f680; 从入门到精通的完整学习路径 &#x1f4a1; 实战项目经…

[前端技术基础]CSS选择器冲突解决方法-由DeepSeek产生

在 CSS 中&#xff0c;当多个选择器对同一元素的相同属性&#xff08;如颜色&#xff09;定义发生冲突时&#xff0c;浏览器会通过层叠规则&#xff08;Cascading&#xff09;解决冲突。具体优先级从高到低如下&#xff1a;1. !important 规则&#xff08;最高优先级&#xff0…

解决 IDEA 中 XML 文件的 “URI is not registered” 报错

解决 IDEA 中 XML 文件的 “URI is not registered” 报错 在使用 IDEA 开发时&#xff0c;XML 文件&#xff08;尤其是带有 DTD 约束的配置文件&#xff0c;如 MyBatis、Spring 配置文件&#xff09;常出现 URI is not registered (Settings | Languages & Frameworks | S…

FreeBSD Conda Python3.12下安装GPT4Free(g4f)0.5.7.3版本

FreeBSD下不能直接安装g4f&#xff0c;因为Curl_cffi这个库装不上。0.5.0.3这个版本不需要这个库&#xff0c;所以可以安装。 那么就没有办法安装新版本了吗&#xff1f; 有的&#xff0c;就是在linux仿真环境下。 Linux仿真环境安装g4f 最简单的方法是使用chroot进入linux仿…

Node.js 中基于请求 ID 实现简单队列(即时阻止策略/排队等待策略)

在Node.js 中基于请求 ID 实现简单队列 下面示例演示两种策略&#xff0c;以同一个请求 ID 为单位&#xff1a; 即时阻止策略&#xff1a;如果已有相同 ID 的请求在处理&#xff0c;直接报错并返回。 排队等待策略&#xff1a;后续相同 ID 的请求不报错&#xff0c;而是挂起&…

详解如何解决Mysql主从复制延迟

解决 MySQL 主从复制延迟需要从架构设计、参数调优、硬件优化等多维度综合处理。一、根本原因分析主从延迟的本质是&#xff1a;从库的 SQL 线程重放速度 < 主库的写入速度 常见瓶颈点&#xff1a;单线程回放&#xff08;MySQL 5.6 前&#xff09;从库硬件配置低&…

Spring之事务使用指南

Spring之事务使用指南一、事务的基础概念1.1 什么是事务&#xff1f;1.2 事务的ACID特性1.3 Spring事务的核心优势二、Spring事务的核心配置三、事务传播行为&#xff08;Propagation&#xff09;3.1 常用传播行为详解3.1.1 REQUIRED&#xff08;默认值&#xff09;3.1.2 SUPPO…

基于FPGA的多级流水线加法器verilog实现,包含testbench测试文件

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统原理简介 5.参考文献 6.完整工程文件 1.课题概述 流水线&#xff08;Pipeline&#xff09;技术源于工业生产中的装配线理念&#xff0c;在数字电路中&#xff0c;它将一个复杂运算任务分解为若干个子任务&#xff0c;每…

5.1.4习题精讲

一、单项选择题 01. 下列部件不属于控制器的是&#xff08; C &#xff09;。 题目原文 下列部件不属于控制器的是&#xff08; &#xff09;。 A. 指令寄存器 B. 程序计数器 C. 程序状态字寄存器 D. 时序电路 正确答案&#xff1a;C 题目解析 考点分析&#xff1a; 本题考察CP…

华为云Flexus+DeepSeek征文|低代码 × 强推理:华为云 Flexus 搭建可部署的 AI Agent 实践方案【搭建宠物养护小知识AI助手】

文章目录华为云FlexusDeepSeek征文&#xff5c;低代码 强推理&#xff1a;华为云 Flexus 搭建可部署的 AI Agent 实践方案【搭建宠物养护小知识AI助手】&#x1f680; 引言一、核心技术概览1. 华为云 Flexus X2. DeepSeek-R1 模型3. Dify 平台二、总体架构设计三、环境准备与资…

基于智慧经营系统的学校住宿登记报表分析与应用探究-毕业论文—仙盟创梦IDE

摘要本文聚焦学校住宿场景&#xff0c;以 “未来之窗智慧经营&#xff08;学校住宿&#xff09;” 系统生成的日报表、昨日报表、本月报表为研究对象&#xff0c;深入剖析报表数据结构、功能价值及在住宿管理中的应用。通过解读水费、电费、押金、房费、总计、订单等数据维度&a…

arping(ARP协议网络测试工具)

1. 项目介绍&#xff1a;arping 是一个用于在局域网&#xff08;LAN&#xff09;中查找特定 IP 地址是否被占用的实用工具。与传统的 ping 命令不同&#xff0c;arping 使用 ARP 协议来发送和接收数据包&#xff0c;从而能够检测到那些阻止 ICMP 请求的主机。arping 可以帮助网…