跳到内容

SQLModel

SQLModel SQLModel

SQLModel,Python 中的 SQL 数据库,专为简洁、兼容性和稳健性而设计。

Test Publish Coverage Package version


文档: https://sqlmodel.cn

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


SQLModel 是一个用于从 Python 代码与 SQL 数据库 交互的库,使用 Python 对象。它被设计为直观、易于使用、高度兼容且稳健。

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 typing import Optional

from sqlmodel import Field, SQLModel


class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = 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 typing import Optional

from sqlmodel import Field, Session, SQLModel, create_engine


class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = 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 typing import Optional

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


class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = 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 许可证的条款获得许可。