跳到内容

SQLModel

SQLModel SQLModel

SQLModel,Python 中的 SQL 数据库,设计旨在简洁、兼容和健壮。

Test Publish Coverage Package version


文档: https://sqlmodel.fastapi.org.cn

源代码: https://github.com/fastapi/sqlmodel


SQLModel 是一个库,用于通过 Python 对象与 Python 代码中的 SQL 数据库 进行交互。它旨在直观、易用、高度兼容且健壮。

SQLModel 基于 Python 类型注解,并由 PydanticSQLAlchemy 提供支持。

主要功能有:

  • 直观编写:出色的编辑器支持。完成无处不在。减少调试时间。设计易于使用和学习。减少阅读文档的时间。
  • 易于使用:它具有合理的默认值,并在底层做了大量工作以简化您编写的代码。
  • 兼容:它旨在与 FastAPI、Pydantic 和 SQLAlchemy 兼容。
  • 可扩展:您拥有 SQLAlchemy 和 Pydantic 的所有强大功能。
  • 简洁:最小化代码重复。单个类型注解完成大量工作。无需在 SQLAlchemy 和 Pydantic 中重复模型。

赞助商

FastAPI 中的 SQL 数据库

SQLModel 旨在简化 FastAPI 应用程序中与 SQL 数据库的交互,它由同一位作者创建。😁

它结合了 SQLAlchemy 和 Pydantic,并试图尽可能简化您编写的代码,从而将代码重复减少到最低限度,同时获得最佳的开发体验

SQLModel 实际上是 PydanticSQLAlchemy 之上的一个薄层,经过精心设计以与两者兼容。

要求

最新的且当前受支持的 Python 版本

由于 SQLModel 基于 PydanticSQLAlchemy,它需要它们。当您安装 SQLModel 时,它们将自动安装。

安装

确保您创建了一个虚拟环境,激活它,然后安装 SQLModel,例如使用

$ pip install sqlmodel
---> 100%
Successfully installed sqlmodel

示例

有关数据库、SQL 和其他所有内容的介绍,请参阅 SQLModel 文档

这里有一个快速示例。✨

一个 SQL 表

想象你有一个名为 hero 的 SQL 表,其中包含

  • id
  • name
  • secret_name
  • age

你希望它有这些数据

id name secret_name age
1 死侍 戴夫·威尔逊
2 蜘蛛男孩 佩德罗·帕尔克多
3 锈人 汤米·夏普 48

创建 SQLModel 模型

然后你可以像这样创建一个 SQLModel 模型

from sqlmodel import Field, SQLModel


class Hero(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: int | None = None

那个 Hero 类是一个 SQLModel 模型,相当于 Python 代码中的 SQL 表。

这些类属性中的每一个都等同于每个表列

创建行

然后你可以将表的每一行创建为模型的实例

hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)

通过这种方式,您可以使用常规 Python 代码,其中包含代表实例,从而与SQL 数据库进行通信。

编辑器支持

一切都旨在为您提供最佳的开发体验,并提供最佳的编辑器支持。

包括自动完成

内联错误

写入数据库

通过快速学习教程,您可以了解更多关于 SQLModel 的信息,但如果您现在需要了解如何将所有这些组合在一起并保存到数据库,您可以这样做

from sqlmodel import Field, Session, SQLModel, create_engine


class Hero(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: int | None = None


hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)


engine = create_engine("sqlite:///database.db")


SQLModel.metadata.create_all(engine)

with Session(engine) as session:
    session.add(hero_1)
    session.add(hero_2)
    session.add(hero_3)
    session.commit()

这将保存一个包含 3 个英雄的 SQLite 数据库。

从数据库中选择

然后您可以编写查询以从同一个数据库中选择,例如使用

from sqlmodel import Field, Session, SQLModel, create_engine, select


class Hero(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: int | None = None


engine = create_engine("sqlite:///database.db")

with Session(engine) as session:
    statement = select(Hero).where(Hero.name == "Spider-Boy")
    hero = session.exec(statement).first()
    print(hero)

无处不在的编辑器支持

SQLModel 经过精心设计,旨在为您提供最佳的开发体验和编辑器支持,即使从数据库中选择数据之后也是如此

SQLAlchemy 和 Pydantic

那个 Hero 类是一个 SQLModel 模型。

但同时,✨ 它也是一个 SQLAlchemy 模型 ✨。因此,您可以将其与其他 SQLAlchemy 模型结合使用,或者您可以轻松地将带有 SQLAlchemy 的应用程序迁移到 SQLModel

同时,✨ 它也是一个 Pydantic 模型 ✨。您可以使用它进行继承来定义所有数据模型,同时避免代码重复。这使得它非常容易与 FastAPI 一起使用。

许可证

本项目根据 MIT 许可证的条款获得许可。