绵阳哪里可以做网站的地方深圳域名空间
2026/2/14 16:20:36 网站建设 项目流程
绵阳哪里可以做网站的地方,深圳域名空间,网站建设怎么入会计账,google搜索引擎入口网址大家好#xff0c;我是jobleap.cn的小九。 SQLModel 是一个专为 Python 设计的、融合了 Pydantic 和 SQLAlchemy 优势的 ORM#xff08;对象关系映射#xff09;库#xff0c;它主要用来简化数据库操作与数据校验的流程#xff0c;解决传统数据库开发中「数据模型定义重复…大家好我是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,tableTrue):英雄表模型tableTrue 表示该类对应数据库表id:int|NoneField(defaultNone,primary_keyTrue)# 主键自动递增name:strField(indexTrue)# 普通字段建立索引age:int|NoneField(defaultNone,gt0,lt150)# 可选字段校验年龄范围power:str|NoneNone# 可选字段无额外约束# 2. 定义仅用于校验的模型非数据库表classHeroCreate(SQLModel):创建英雄时的入参校验模型无需主键由数据库自动生成name:strage:int|NoneField(defaultNone,gt0,lt150)power:str|NoneNone2. 数据库连接与表创建# 1. 配置数据库连接SQLite 无需额外驱动适合快速测试DATABASE_URLsqlite:///./heroes.db# 注意SQLite 需要 check_same_threadFalse其他数据库无需enginecreate_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创建数据Createdefcreate_hero(hero:HeroCreate):# 将校验模型转换为数据库模型自动忽略无关字段db_heroHero.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_mancreate_hero(HeroCreate(name钢铁侠,age45,power高科技战甲))spider_mancreate_hero(HeroCreate(name蜘蛛侠,age18,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:herosession.get(Hero,hero_id)# 快捷查询主键returnherodefget_all_heroes(skip:int0,limit:int10)-list[Hero]:查询英雄列表分页withSession(engine)assession:statementselect(Hero).offset(skip).limit(limit)# 构建查询语句heroessession.exec(statement).all()# 执行查询并获取所有结果returnheroesdefget_heroes_by_age(age:int)-list[Hero]:条件查询根据年龄查询英雄withSession(engine)assession:statementselect(Hero).where(Hero.ageage)# 条件过滤heroessession.exec(statement).all()returnheroes# 调用示例if__name____main__:# 查询单个英雄hero_1get_hero_by_id(1)print(ID1 的英雄,hero_1)# 查询所有英雄all_heroesget_all_heroes()print(所有英雄,all_heroes,sep\n)# 条件查询young_heroesget_heroes_by_age(18)print(18岁的英雄,young_heroes)3更新数据Updatedefupdate_hero(hero_id:int,hero:HeroCreate)-Hero|None:更新英雄信息withSession(engine)assession:db_herosession.get(Hero,hero_id)ifnotdb_hero:returnNone# 将新数据更新到数据库模型仅更新传入的字段hero_datahero.model_dump(exclude_unsetTrue)# 排除未设置的字段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_spiderupdate_hero(2,HeroCreate(name蜘蛛侠,age19,power蜘蛛感应纳米战衣))print(更新后的蜘蛛侠,updated_spider)4删除数据Deletedefdelete_hero(hero_id:int)-bool:删除英雄withSession(engine)assession:herosession.get(Hero,hero_id)ifnothero:returnFalsesession.delete(hero)session.commit()returnTrue# 调用示例if__name____main__:# 删除ID1的英雄is_deleteddelete_hero(1)print(删除结果,成功ifis_deletedelse失败)4. 进阶用法关联模型一对一/一对多SQLModel 支持表关联以下是「英雄-团队」一对多关联示例fromsqlmodelimportRelationship# 定义团队模型classTeam(SQLModel,tableTrue):id:int|NoneField(defaultNone,primary_keyTrue)name:strField(indexTrue)# 关联英雄反向引用hero.teamheroes:list[Hero]Relationship(back_populatesteam)# 扩展英雄模型添加团队外键classHero(SQLModel,tableTrue):id:int|NoneField(defaultNone,primary_keyTrue)name:strField(indexTrue)age:int|NoneField(defaultNone,gt0,lt150)power:str|NoneNoneteam_id:int|NoneField(defaultNone,foreign_keyteam.id)# 外键team:Team|NoneRelationship(back_populatesheroes)# 关联团队# 实战创建团队并关联英雄if__name____main__:create_db_and_tables()# 创建团队avengersTeam(name复仇者联盟)withSession(engine)assession:session.add(avengers)session.commit()session.refresh(avengers)# 创建英雄并关联团队captain_americaHero(name美国队长,age100,power超级血清,team_idavengers.id)session.add(captain_america)session.commit()# 查询团队及关联的英雄statementselect(Team).where(Team.name复仇者联盟)teamsession.exec(statement).first()print(团队名称,team.name)print(团队英雄,team.heroes)四、与 FastAPI 集成实战延伸SQLModel 与 FastAPI 天然兼容同作者以下是快速集成示例fromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModel appFastAPI()# 初始化数据库app.on_event(startup)defon_startup():create_db_and_tables()# 接口创建英雄app.post(/heroes/,response_modelHero)defcreate_hero_api(hero:HeroCreate):returncreate_hero(hero)# 接口查询单个英雄app.get(/heroes/{hero_id},response_modelHero)defget_hero_api(hero_id:int):heroget_hero_by_id(hero_id)ifnothero:raiseHTTPException(status_code404,detailHero not found)returnhero# 运行uvicorn main:app --reload总结核心价值SQLModel 实现「一份模型数据校验数据库操作」消除重复代码提升开发效率核心 APISQLModel模型基类、create_engine数据库连接、Session会话管理、select()查询构建、model_validate()/model_dump()数据转换是高频使用的核心 API核心场景适合快速开发 Python 后端项目尤其是 FastAPI简化数据库 CRUD 操作同时保证数据校验的严谨性。通过以上教程你可以快速掌握 SQLModel 的核心用法解决传统数据库开发中「模型重复」「校验繁琐」「SQL 易出错」等问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询