SQLModel,Python中的SQL数据库,为简单性、兼容性和稳健性而设计。
文档:https://sqlmodel.tiangolo.com
源代码: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 时,它们会自动安装。
安装
$ pip install sqlmodel
---> 100%
成功安装 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 许可证 条款授权。