跳转到内容

SQLModel

SQLModel SQLModel

SQLModel,Python 中的 SQL 数据库,旨在简化、兼容性和稳健性。

Test Publish Coverage Package version


文档: https://sqlmodel.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,并尝试尽可能简化您编写的代码,从而最大限度地减少代码重复,同时获得最佳的开发人员体验

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

要求

最近且当前受支持的 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 Deadpond Dive Wilson null
2 Spider-Boy Pedro Parqueador null
3 Rusty-Man Tommy Sharp 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 许可证 的条款获得许可。