SQLModel:一个模型,同时搞定 ORM 和数据校验

SQLModel:一个模型,同时搞定 ORM 和数据校验 文章目录SQLModel一个模型同时搞定 ORM 和数据校验1、这玩意儿是干嘛的2、为什么要用它3、用起来长什么样4、编辑器支持5、适合哪些人用SQLModel一个模型同时搞定 ORM 和数据校验sqlmodel 在 GitHub 上已经有 18,000 Star。FastAPI 作者做的 ORM 库核心思路很简单用一份代码同时满足 SQLAlchemy 的表映射和 Pydantic 的数据校验不用写两套模型。1、这玩意儿是干嘛的SQLModel 是一个基于 Python 类型注解的 ORM 库底层由 Pydantic 和 SQLAlchemy 驱动。它并不替代这两者定位是把 Pydantic 和 SQLAlchemy 捏合在一起。你写一个类它同时是 SQLAlchemy 模型也是 Pydantic 模型。这意味着什么以前你要定义一套 SQLAlchemy 模型给数据库用再定义一套 Pydantic 模型给接口传参和返回值用。SQLModel 把这两件事合到一块一个类就搞定。SQLModel 跟 FastAPI、Pydantic、SQLAlchemy 都是兼容的。你已有的 SQLAlchemy 代码可以直接混用Pydantic 的校验逻辑也全部保留。它只是一个很薄的中间层没有引入新的抽象概念。2、为什么要用它代码重复是多数 Python Web 项目的通病。模型层写两遍改字段要改两处一不小心就不同步。SQLModel 的做法是用类型注解一次性声明fromsqlmodelimportField,SQLModelclassHero(SQLModel,tableTrue):id:int|NoneField(defaultNone,primary_keyTrue)name:strsecret_name:strage:int|NoneNone这个Hero类可以直接用来建表、增删改查也可以直接传给 FastAPI 做请求体校验和响应序列化。3、用起来长什么样创建记录就是实例化对象hero_1Hero(nameDeadpond,secret_nameDive Wilson)hero_2Hero(nameSpider-Boy,secret_namePedro Parqueador)写入数据库fromsqlmodelimportSession,create_engine enginecreate_engine(sqlite:///database.db)SQLModel.metadata.create_all(engine)withSession(engine)assession:session.add(hero_1)session.add(hero_2)session.commit()查询fromsqlmodelimportselectwithSession(engine)assession:statementselect(Hero).where(Hero.nameSpider-Boy)herosession.exec(statement).first()print(hero)语法跟 SQLAlchemy 2.0 基本一致没有额外的学习成本。4、编辑器支持因为是 Pydantic 模型IDE 的自动补全和类型检查都能用。SQLModel 官方文档里也着重强调了这一点写代码时的提示和报错都能正常工作。5、适合哪些人用在用 FastAPI 开发接口、需要跟数据库打交道的开发者厌倦了维护两套模型、希望减少代码重复的 Python 后端开发者刚开始接触 ORM、想要一个类型友好且文档完整的入门方案的人安装也很简单pipinstallsqlmodelPydantic 和 SQLAlchemy 会自动作为依赖装上。入门方案的人安装也很简单pipinstallsqlmodelPydantic 和 SQLAlchemy 会自动作为依赖装上。