Что такое SQLModel

SQLModel — библиотека автора FastAPI. Один класс может быть одновременно таблицей SQLAlchemy и моделью Pydantic, поэтому поля описываются один раз и работают и для базы, и для валидации запроса, и для ответа.

Одна база, таблица и схемы
Одна база, таблица и схемы
Классtable=TrueРоль
HeroBaseнетобщие поля
Heroдатаблица базы
HeroCreateнеттело запроса
HeroPublicнетмодель ответа
HeroUpdateнеттело PATCH

Установка: pip install sqlmodel fastapi. Библиотека пока в версиях 0.0.x, поэтому закрепляйте версию и читайте список изменений перед обновлением.

💡 SQLModel — тонкий слой над SQLAlchemy. Если нужна продвинутая возможность, можно использовать SQLAlchemy напрямую.

Модели и первый запрос

python
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

Модель таблицы и схемы