SQLModel 全面教程:常用 API 串联与实战指南

大家好,我是jobleap.cn的小九。
SQLModel 是一个专为 Python 设计的、融合了 Pydantic 和 SQLAlchemy 优势的 ORM(对象关系映射)库,它主要用来简化数据库操作与数据校验的流程,解决传统数据库开发中「数据模型定义重复」「类型校验繁琐」「SQL 编写复杂」等核心问题。

一、SQLModel 核心价值与解决的问题

1. 核心定位

SQLModel 由 FastAPI 作者 Sebastián Ramírez 开发,核心目标是:一份模型定义,同时满足数据库操作(SQLAlchemy)和数据校验(Pydantic)需求

2. 解决的核心问题

  • 传统开发中,需要分别定义 Pydantic 校验模型和 SQLAlchemy 数据库模型,存在大量重复代码;
  • 手动编写 SQL 语句易出错,且缺乏类型提示,开发效率低;
  • 数据库操作与数据校验的衔接繁琐,需要手动转换数据格式;
  • 新手入门 ORM 时,SQLAlchemy 的复杂度较高,学习成本大。

二、环境准备

首先安装依赖(推荐使用虚拟环境):

pipinstallsqlmodel python-dotenv# sqlmodel核心 + 环境变量管理# 如需连接MySQL/PostgreSQL,需额外安装驱动:# pip install pymysql # MySQL# pip install psycopg2-binary # PostgreSQL

三、核心 API 与基础使用

1. 定义数据模型(核心:单模型双用途)

SQLModel 的核心是SQLModel基类,继承它的类既可以作为数据库表模型,也可以作为 Pydantic 校验模型。

fromsqlmodelimportField,SQLModel,create_engine,Session,select# 1. 定义数据库模型(同时支持数据校验)classHero(SQLModel,table=True):"""英雄表模型:table=True 表示该类对应数据库表"""id:int|None=Field(default=None,primary_key=True)# 主键,自动递增name:str=Field(index=True)# 普通字段,建立索引age:int|None=Field(default=None,gt=0,lt=150)# 可选字段,校验年龄范围power:str|None=None# 可选字段,无额外约束# 2. 定义仅用于校验的模型(非数据库表)classHeroCreate(SQLModel):"""创建英雄时的入参校验模型(无需主键,由数据库自动生成)"""name:strage:int|None=Field(default=None,gt=0,lt=150)power:str|None=None

2. 数据库连接与表创建

# 1. 配置数据库连接(SQLite 无需额外驱动,适合快速测试)DATABASE_URL="sqlite:///./heroes.db"# 注意:SQLite 需要 check_same_thread=False(其他数据库无需)engine=create_engine(DATABASE_URL,connect_args={"check_same_thread":False})# 2. 创建所有表(仅需执行一次)defcreate_db_and_tables():SQLModel.metadata.create_all(engine)# 初始化数据库表if__name__=="__main__":create_db_and_tables()

3. 核心 CRUD API 实战

CRUD(创建/读取/更新/删除)是数据库操作的核心,以下是 SQLModel 常用 API 的串联实战:

(1)创建数据(Create)
defcreate_hero(hero:HeroCreate):# 将校验模型转换为数据库模型(自动忽略无关字段)db_hero=Hero.model_validate(hero)# 使用 Session 管理数据库连接withSession(engine)assession:session.add(db_hero)# 添加数据到会话session.commit()# 提交事务session.refresh(db_hero)# 刷新数据(获取自动生成的主键)returndb_hero# 调用示例if__name__=="__main__":create_db_and_tables()# 创建英雄iron_man=create_hero(HeroCreate(name="钢铁侠",age=45,power="高科技战甲"))spider_man=create_hero(HeroCreate(name="蜘蛛侠",age=18,power="蜘蛛感应"))print("创建的英雄:",iron_man,spider_man,sep="\n")
(2)读取数据(Read)

支持单条查询、列表查询、条件查询,核心 API 是select()+session.exec()

defget_hero_by_id(hero_id:int)->Hero|None:"""根据ID查询单个英雄"""withSession(engine)assession:hero=session.get(Hero,hero_id)# 快捷查询主键returnherodefget_all_heroes(skip:int=0,limit:int=10)->list[Hero]:"""查询英雄列表(分页)"""withSession(engine)assession:statement=select(Hero).offset(skip).limit(limit)# 构建查询语句heroes=session.exec(statement).all()# 执行查询并获取所有结果returnheroesdefget_heroes_by_age(age:int)->list[Hero]:"""条件查询:根据年龄查询英雄"""withSession(engine)assession:statement=select(Hero).where(Hero.age==age)# 条件过滤heroes=session.exec(statement).all()returnheroes# 调用示例if__name__=="__main__":# 查询单个英雄hero_1=get_hero_by_id(1)print("ID=1 的英雄:",hero_1)# 查询所有英雄all_heroes=get_all_heroes()print("所有英雄:",all_heroes,sep="\n")# 条件查询young_heroes=get_heroes_by_age(18)print("18岁的英雄:",young_heroes)
(3)更新数据(Update)
defupdate_hero(hero_id:int,hero:HeroCreate)->Hero|None:"""更新英雄信息"""withSession(engine)assession:db_hero=session.get(Hero,hero_id)ifnotdb_hero:returnNone# 将新数据更新到数据库模型(仅更新传入的字段)hero_data=hero.model_dump(exclude_unset=True)# 排除未设置的字段forkey,valueinhero_data.items():setattr(db_hero,key,value)session.add(db_hero)session.commit()session.refresh(db_hero)returndb_hero# 调用示例if__name__=="__main__":# 更新蜘蛛侠的年龄updated_spider=update_hero(2,HeroCreate(name="蜘蛛侠",age=19,power="蜘蛛感应+纳米战衣"))print("更新后的蜘蛛侠:",updated_spider)
(4)删除数据(Delete)
defdelete_hero(hero_id:int)->bool:"""删除英雄"""withSession(engine)assession:hero=session.get(Hero,hero_id)ifnothero:returnFalsesession.delete(hero)session.commit()returnTrue# 调用示例if__name__=="__main__":# 删除ID=1的英雄is_deleted=delete_hero(1)print("删除结果:","成功"ifis_deletedelse"失败")

4. 进阶用法:关联模型(一对一/一对多)

SQLModel 支持表关联,以下是「英雄-团队」一对多关联示例:

fromsqlmodelimportRelationship# 定义团队模型classTeam(SQLModel,table=True):id:int|None=Field(default=None,primary_key=True)name:str=Field(index=True)# 关联英雄(反向引用:hero.team)heroes:list["Hero"]=Relationship(back_populates="team")# 扩展英雄模型,添加团队外键classHero(SQLModel,table=True):id:int|None=Field(default=None,primary_key=True)name:str=Field(index=True)age:int|None=Field(default=None,gt=0,lt=150)power:str|None=Noneteam_id:int|None=Field(default=None,foreign_key="team.id")# 外键team:Team|None=Relationship(back_populates="heroes")# 关联团队# 实战:创建团队并关联英雄if__name__=="__main__":create_db_and_tables()# 创建团队avengers=Team(name="复仇者联盟")withSession(engine)assession:session.add(avengers)session.commit()session.refresh(avengers)# 创建英雄并关联团队captain_america=Hero(name="美国队长",age=100,power="超级血清",team_id=avengers.id)session.add(captain_america)session.commit()# 查询团队及关联的英雄statement=select(Team).where(Team.name=="复仇者联盟")team=session.exec(statement).first()print("团队名称:",team.name)print("团队英雄:",team.heroes)

四、与 FastAPI 集成(实战延伸)

SQLModel 与 FastAPI 天然兼容(同作者),以下是快速集成示例:

fromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModel app=FastAPI()# 初始化数据库@app.on_event("startup")defon_startup():create_db_and_tables()# 接口:创建英雄@app.post("/heroes/",response_model=Hero)defcreate_hero_api(hero:HeroCreate):returncreate_hero(hero)# 接口:查询单个英雄@app.get("/heroes/{hero_id}",response_model=Hero)defget_hero_api(hero_id:int):hero=get_hero_by_id(hero_id)ifnothero:raiseHTTPException(status_code=404,detail="Hero not found")returnhero# 运行:uvicorn main:app --reload

总结

  1. 核心价值:SQLModel 实现「一份模型=数据校验+数据库操作」,消除重复代码,提升开发效率;
  2. 核心 APISQLModel(模型基类)、create_engine(数据库连接)、Session(会话管理)、select()(查询构建)、model_validate()/model_dump()(数据转换)是高频使用的核心 API;
  3. 核心场景:适合快速开发 Python 后端项目(尤其是 FastAPI),简化数据库 CRUD 操作,同时保证数据校验的严谨性。

通过以上教程,你可以快速掌握 SQLModel 的核心用法,解决传统数据库开发中「模型重复」「校验繁琐」「SQL 易出错」等问题。

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

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

相关文章

SQLModel 全面教程:常用 API 串联与实战指南

大家好,我是jobleap.cn的小九。 SQLModel 是一个专为 Python 设计的、融合了 Pydantic 和 SQLAlchemy 优势的 ORM(对象关系映射)库,它主要用来简化数据库操作与数据校验的流程,解决传统数据库开发中「数据模型定义重复…

论文写作神器:十大AI辅助工具榜单

工具名称核心优势适用场景aicheck快速降AIGC率至个位数AIGC优化、重复率降低aibiye智能生成论文大纲论文结构与内容生成askpaper文献高效整合开题报告与文献综述秒篇降重效果显著重复率大幅降低一站式论文查重降重查重改写一站式完整论文优化深度AI降重深度改写保留原意文本结构…

谁是 2026 年百度竞价最强服务商?三大实力公司深度对比

2026年百度竞价代运营服务商观察:这三类企业更受客户青睐 在流量成本持续攀升的2026年,百度搜索依然是B2B企业获取高意向客户的重要渠道。然而,随着算法迭代加速、竞争关键词价格翻倍,越来越多中小企业发现:“开了…

2026年度北京回收名家字画机构推荐:这三家高价又靠谱,藏家必看

藏友们好!作为深耕北京古玩收藏圈多年的自媒体人,每年都会收到上百条私信,问得最多的就是“手里有名家字画想变现,哪家机构给价高又不坑人?”2026年北京字画回收市场依旧乱象丛生,虚高报价诱上门、暗箱操作压价、…

苏州 Linux服务器 无法进入系统(Grub Rescue)

序幕:自动化更新的“午夜惊魂”周四凌晨2点17分,万籁俱寂。“智云科技”数据中心的自动化运维系统,正依照既定策略,向数百台服务器推送安全更新补丁。多数服务器安静地完成了任务,唯独那台承载着5TB核心客户画像数据的…

2026年制冷机/气体制冷机/冷热一体机 优选榜单公布

一、行业发展背景及市场现状 在全球能源转型与高端制造业升级的双重推动下,制冷机、气体制冷机、冷热一体机行业迎来高质量发展期,产品技术持续迭代,市场需求多元化升级。据产业世界数据显示,2024年全球制冷设备市…

SQLAlchemy 全面教程:常用 API 串联与实战指南

大家好,我是jobleap.cn的小九。 关于Python 的 SQLAlchemy 组件的核心用途、解决的问题,以及一套系统的实战教程,我会从核心价值到具体 API 再到实战案例,帮你全面掌握这个工具。 一、SQLAlchemy 核心定位:能做什么&am…

LLM知识随笔(二)--BERT

LLM知识随笔(二)–BERT 文章目录 LLM知识随笔(二)--BERT一、BERT:公认的里程碑1. BERT与GPT之间的区别:2.单向编码与双向编码的区别 二、BERT的结构:强大的特征提取能力1.ELMo、GPT、BERT三者区…

2026 年百度竞价代运营公司排名公布:TOP3 权威测评来了!

2026 年百度竞价广告迎来全新规则升级,关键词竞价资产前置释放、AI 智能出价模型迭代、质量分考核维度更趋精细化,让粗放式投放彻底失去生存空间,企业想要靠百度竞价精准获客,选对专业的开户代运营服务商成为核心关…

AIGC论文助手:10款智能写作工具盘点

工具名称核心优势适用场景aicheck快速降AIGC率至个位数AIGC优化、重复率降低aibiye智能生成论文大纲论文结构与内容生成askpaper文献高效整合开题报告与文献综述秒篇降重效果显著重复率大幅降低一站式论文查重降重查重改写一站式完整论文优化深度AI降重深度改写保留原意文本结构…

显示器的宽高比一般是多少?什么是屏幕分辨率?常讲的2K 、4K和8K电视是什么含义?

显示器的宽高比指的是屏幕显示画面的宽度与高度的比值,通常以最简整数比的形式表示,标准化比例包括4:3(传统标准)、16:9(当前主流)和21:9(小众特殊比例),它决定了屏幕的整体形状,与分…

在Ubuntu上下载Questasim

仅为本人实操记录,旨在帮助遇到同样问题的友友们。本人小白,所以说的可能比较啰嗦。 用的是VMWare 17Pro,Ubuntu24.04,Questasim10.7c,也是跟着其他人的教程做的,但是过程中出现了很多问题,所以按照我解决之后的…

No.9 监理工作的组织和规划

监理工作的组织和规划 一、监理工作组织和规划总览 (一)核心意义 通俗解释 监理工作要想干得好,核心得抓两件事:一是“人要靠谱、分工明确”,二是“计划清晰、有章可循”。就像一支施工队,得先确定谁是…

十大AI论文神器:智能降重与高效写作指南

十大AI论文生成工具排行榜:AIGC降重,论文写作生成新选择 工具名称 核心优势 适用场景 aicheck 快速降AIGC率至个位数 AIGC优化、重复率降低 aibiye 智能生成论文大纲 论文结构与内容生成 askpaper 文献高效整合 开题报告与文献综述 秒篇 降…

TAOCP 1.2.1部分习题 - Ghost

TAOCP 1.2.1部分习题 T9 题目标记:[25] 题目: 试求下面式子的求和表达式,并予以证明: \[1^2 , 2^2 -1^2 , 3^2 -2^2 +1^2 , 4^2 -3^2 +2^2 -1^2 \]以下是分析: 手动计算几个,发现就是等差数列求和。 于是我们猜想…

论文降重利器:AI生成工具Top10推荐

工具名称核心优势适用场景aicheck快速降AIGC率至个位数AIGC优化、重复率降低aibiye智能生成论文大纲论文结构与内容生成askpaper文献高效整合开题报告与文献综述秒篇降重效果显著重复率大幅降低一站式论文查重降重查重改写一站式完整论文优化深度AI降重深度改写保留原意文本结构…

攻防世界baby_web

1.根据题目提示 题目提示初始界面 服务器通常会优先加载这些文件名作为初始页面:index.php、index.html、index.htm default.php、default.html home.php、home.html2.尝试 方法一 用dirsearch进行扫描可以发现存在in…

学长亲荐2026研究生必用AI论文网站TOP9:开题报告文献综述神器

学长亲荐2026研究生必用AI论文网站TOP9:开题报告文献综述神器 2026年研究生必备AI论文工具测评:精准定位你的学术好帮手 随着人工智能技术的不断进步,越来越多的研究生开始依赖AI工具来提升论文写作效率。然而,面对市场上琳琅满…

如何安全抓取SoundCloud数据用于音频 AI 模型训练?

音频 AI 训练模型对高质量、多样化的音频数据需求极高,而 SoundCloud 是全球最大的音频分享社区之一,包含数百万曲目和丰富的元数据,是进行音频分析、生成和增强等任务的理想来源。然而,由于 SoundCloud 的动态内容渲染、API 限制…

云服务器部署项目

一、配置环境法律文书生成与案例智能检索系统使用了ElasticSearch、Redis、MySQL、kkFileView。因此需要将这些组件在云服务器启动并配置到项目中。保证项目可以正确部署。1、首先在云服务器下载docker在云服务器下载docker之后,使用docker拉取所需的组件镜像并启动…