SQLModel
SQLModel,Python 中的 SQL 数据库,专为简洁、兼容性和稳健性而设计。
源代码: https://github.com/fastapi/sqlmodel
SQLModel 是一个用于从 Python 代码与 SQL 数据库 交互的库,使用 Python 对象。它被设计为直观、易于使用、高度兼容且稳健。
SQLModel 基于 Python 类型注解,并由 Pydantic 和 SQLAlchemy 提供支持。
主要特点是
- 直观编写:出色的编辑器支持。 处处补全。减少调试时间。设计为易于使用和学习。减少阅读文档的时间。
- 易于使用:它具有合理的默认设置,并在底层完成大量工作以简化您编写的代码。
- 兼容:它被设计为与 FastAPI、Pydantic 和 SQLAlchemy 兼容。
- 可扩展:您拥有 SQLAlchemy 和 Pydantic 在底层的所有强大功能。
- 简洁:最大限度地减少代码重复。单个类型注解可以完成大量工作。无需在 SQLAlchemy 和 Pydantic 中重复模型。
赞助商¶
FastAPI 中的 SQL 数据库¶
SQLModel 旨在简化在 FastAPI 应用程序中与 SQL 数据库的交互,它由同一位 作者 创建。😁
它结合了 SQLAlchemy 和 Pydantic,并尝试尽可能简化您编写的代码,从而最大限度地减少代码重复,同时获得最佳的开发者体验。
SQLModel 实际上是 Pydantic 和 SQLAlchemy 之上的一个薄层,经过精心设计,与两者兼容。
要求¶
最新且当前受支持的 Python 版本。
由于 SQLModel 基于 Pydantic 和 SQLAlchemy,因此它需要它们。当您安装 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 许可证的条款获得许可。