Что такое SQLModel
SQLModel — библиотека автора FastAPI. Один класс может быть одновременно таблицей SQLAlchemy и моделью Pydantic, поэтому поля описываются один раз и работают и для базы, и для валидации запроса, и для ответа.
| Класс | table=True | Роль |
|---|---|---|
HeroBase | нет | общие поля |
Hero | да | таблица базы |
HeroCreate | нет | тело запроса |
HeroPublic | нет | модель ответа |
HeroUpdate | нет | тело PATCH |
Установка: pip install sqlmodel fastapi. Библиотека пока в версиях 0.0.x, поэтому закрепляйте версию и читайте список изменений перед обновлением.
💡 SQLModel — тонкий слой над SQLAlchemy. Если нужна продвинутая возможность, можно использовать SQLAlchemy напрямую.
Модели и первый запрос
from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
age: int | None = None
engine = create_engine("sqlite://")
SQLModel.metadata.create_all(engine)
with Session(engine) as session:
session.add(Hero(name="Deadpond", age=30))
session.add(Hero(name="Rusty-Man", age=48))
session.commit()
stmt = select(Hero).where(Hero.age > 35)
heroes = session.exec(stmt).all()
print([h.name for h in heroes])
# ['Rusty-Man']id имеет тип int | None, потому что база выдаёт его при commit. Имя таблицы по умолчанию — имя класса в нижнем регистре (hero).
| Вызов | Что делает |
|---|---|
session.add(obj) | кладёт объект в сессию |
session.commit() | записывает изменения |
session.refresh(obj) | перечитывает объект (заполняет id) |
session.get(Hero, 1) | объект по ключу или None |
session.exec(select(...)) | выполняет запрос: .all(), .first(), .one() |
session.delete(obj) | помечает удаление, нужен commit |