跳至内容

SQLModel

SQLModel

SQLModel,用于 Python 的 SQL 数据库,旨在简化、兼容和健壮。

Test Publish Coverage Package version


文档: https://sqlmodel.cn

源代码: https://github.com/tiangolo/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 时会自动安装它们。

安装

$ 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 许可证 的条款授权。