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

python对接mysql和模型类的故障

你疑惑的这两段代码(detail接口的mappings()查询、Videos模型类)本质上是「定义」和「查询实现」的关系,本身没有逻辑冲突,但存在「字段约束不匹配」和「查询方法兼容性」两个关键小坑,这也是为什么数据库有数据,查询后却取不到(显示None)的核心原因。

我们先拆解两者的关联与差异,再给出针对性修正。

一、先明确:两段代码的核心关系

  1. class Videos(SQLModel, table=True):是数据库表的「抽象定义」,规定了表的字段名、字段类型、约束(必填/主键等),相当于给数据库表和 Python 代码之间搭了一座桥。
  2. session.execute(sql).mappings().first():是查询数据库的「实现方式」,目的是从数据库中取出数据,映射成 Python 可操作的对象,本应和Videos模型类匹配,但有两个坑导致映射失败。

二、关键差异/问题:导致数据查询后显示None

问题1:Videos模型类的字段约束过于严格,与mappings()兼容性差

你的Videos模型中,除了videoidint|None(可选),其他字段(videotitlefilenamekeyword等)都是必填类型(无|None、无默认值),但mappings()返回的是「松散的 RowMapping 映射对象」,不遵守Videos模型的必填约束:

  • 若数据库中某个字段(比如keywordreference)是NULL(上传时未赋值),而模型类中定义为str(必填),mappings()映射时无法满足「必填 str」的约束,会直接将该字段置为None,甚至连带影响其他非 NULL 字段的映射(比如filenamesummary,导致你打印时显示None
  • scalars()返回的是Videos模型实例,会严格遵守模型类的字段定义,自动处理「数据库 NULL 值」和「模型字段类型」的转换,兼容性更好。

问题2:Videos模型缺少「自增属性」,与数据库自增字段不匹配

你的videoid定义:

videoid:int|None=Field(default=None,primary_key=True)

虽然数据库中videoid大概率设置了「自增主键」,但模型类中缺少自增配置sa_column_kwargs={"autoincrement": True}),导致:

  • 模型类和数据库的「自增属性」不匹配,mappings()映射时,无法正确识别videoid的取值,间接影响其他字段的查询结果映射,出现「数据库有值,查询后为None」的现象。

问题3:mappings()vsscalars():查询结果的本质差异(核心)

这是最关键的一点,两者返回的结果完全不同,直接决定了能否取到数据:

查询方法返回结果类型Videos模型的关联取值稳定性
mappings().first()SQLAlchemyRowMapping(只读字典类似物)无直接关联,仅做「列名-值」简单映射差,容易丢失数据、出现None
scalars().first()Videos模型实例(严格遵守模型定义)强关联,自动处理字段类型转换高,100% 保留模型字段数据

简单说:mappings()是「无差别映射」,不管你的Videos模型怎么定义,只按数据库返回的列名映射;scalars()是「精准映射」,只返回符合Videos模型定义的实例,兼容性和稳定性远高于mappings()

三、针对性修正(两步搞定,确保数据能正常取出)

步骤1:修正Videos模型类(匹配数据库,放宽合理约束)

fromsqlmodelimportSQLModel,FieldfromdatetimeimportdatetimeclassVideos(SQLModel,table=True):# 修正1:补全自增属性,与数据库自增主键匹配videoid:int|None=Field(default=None,primary_key=True,sa_column_kwargs={"autoincrement":True}# 新增:开启自增)# 修正2:核心字段(必须有值)保留必填,非核心字段加可选约束(|None),兼容数据库 NULLvideotitle:strfilename:strduration:intcoursename:strcontent:strsummary:str# 非核心字段:允许为 None(兼容数据库 NULL),避免映射失败keyword:str|None=Field(default=None)reference:str|None=Field(default=None)xmindjson:str|None=Field(default=None)examjson:str|None=Field(default=None)createtime:datetime

步骤2:修正detail接口查询方法(改用scalars(),转字典确保模板取值)

这是解决「None问题」的核心,直接替换你现有detail接口:

fromfastapiimportHTTPException# 确保已导入@app.get("/detail/{videoid}")defdetail(request:Request,videoid:int):withSession(engine)assession:sql=select(Videos).where(Videos.videoid==videoid)# 修正:改用 scalars() 获取 Videos 模型实例(而非 mappings())video_instance=session.execute(sql).scalars().first()ifnotvideo_instance:raiseHTTPException(status_code=404,detail="该视频记录不存在")# 模型实例转普通字典,确保模板取值稳定video=video_instance.dict()# 调试打印:此时能看到真实数据,不会是 Noneprint("===== 调试:查询到的视频数据 =====")print("文件名:",video.get("filename"))print("总结内容:",video.get("summary"))print("视频标题:",video.get("videotitle"))print("================================")returntemplates.TemplateResponse(request=request,name="detail.html",context={"video":video})

四、验证效果

  1. 重启 FastAPI 服务(Ctrl+C后重新运行代码);
  2. 访问http://127.0.0.1:8000/detail/2
  3. 查看控制台打印:此时会显示数据库中的真实数据(比如filename是你的视频文件名,summary是你的总结内容),不会再是None
  4. 模板页面中,{{ video['filename'] }}{{ video['summary']|safe }}会正常渲染出内容。

总结

  1. 两段代码无本质逻辑冲突,但存在「字段约束」和「查询方法兼容性」问题;
  2. 核心坑:mappings()兼容性差,无法处理模型必填约束与数据库 NULL 值的矛盾,导致数据显示None
  3. 关键解决:模型类补全自增+放宽非核心字段约束,查询改用scalars()获取模型实例并转字典。

按这个方法修正后,你的数据就能正常查询和显示了,不会再出现「数据库有值,查询后为 None」的现象。

http://www.jsqmd.com/news/317937/

相关文章:

  • 数控直流稳压电源的设计与实现
  • 计算机小程序毕设实战-基于springboot的医院门诊智能预约平台小程序设计与实现基于SpringBoot与微信小程序的乡镇医院挂号预约系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机小程序毕设实战-基于Android的“旧时光”旧物二手闲置交易平台APP基于Android的旧物交易平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于安卓Android的闲置旧物二手交易平台的设计与实现基于Android的旧物交易平台的设计与实现【附源码、数据库、万字文档】
  • 参团活动说明2
  • 参团活动说明
  • 【课程设计/毕业设计】基于微信小程序+SpringBoot的线上超市管理系统设计和实现基于小程序+springboot商城系统设计与实现【附源码、数据库、万字文档】
  • 期刊投稿总被拒?宏智树AI解锁核心刊适配密码,新手也能高效见刊
  • 宁德市英语雅思培训机构推荐|2026权威测评出国雅思辅导机构口碑榜单
  • 市面上远程巡店系统有哪些 落地实用款推荐
  • 2026年天津遗产分割律师联系电话推荐:五大律师深度解析
  • 进口稳、国产强!2025便携激光气体分析仪全球五大优质厂家全解析
  • 2026年目前好用的除尘器气包定制厂家推荐榜单,电磁脉冲阀/除尘器骨架/星型卸料器/通风阀门,除尘器气包定制厂家推荐榜单
  • 宁德市英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜单
  • netty-ChannelHandlerContext学习
  • 2026年天津遗产继承律师联系电话推荐:权威榜单与联系指引
  • 计算机毕业设计|基于springboot + vue药店管理系统(源码+数据库+文档)
  • 计算机毕业设计|基于springboot + vue员工信息管理系统(源码+数据库+文档)
  • 龙岩市英语雅思培训机构推荐|2026权威测评出国雅思辅导机构口碑榜单
  • 油头克星!2026控油洗发水良心推荐,头皮净澈+发丝蓬松,公认好用
  • 2026年哈尔滨冠心病心绞痛公司权威推荐:哈尔滨偏瘫肢体瘫痪/哈尔滨偏瘫语言障碍/哈尔滨偏瘫半身瘫痪/哈尔滨偏瘫后遗症/选择指南
  • 宁德市英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜单
  • 2026年乌鲁木齐琴行推荐:钢琴培训/少儿钢琴/学钢琴服务机构精选
  • 深入解析:【C语言实战(80)】C语言实战:从复盘到进阶,解锁编程新高度
  • 零售行业客流系统哪家实力强 实力品牌排行参考
  • 智造升级新观察:宏山激光和邦德推荐哪个
  • 龙岩市英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜单
  • LangGraph--CompiledStateGraph
  • 售后即战略:宏山激光和邦德哪个售后好
  • 小程序计算机毕设之基于springboot+微信小程序的学生定位考勤系统基于微信小程序的学生定位考勤系统(完整前后端代码+说明文档+LW,调试定制等)