Короткий ответ
Сессия создаётся через sessionmaker(bind=engine)() или контекстный менеджер Session(engine), а запрос строится через select(Model) и выполняется методом session.execute()/session.scalars(), после чего результат извлекается методами .all()/.first().
Как это работает подробнее
Сессия — рабочая единица, отслеживающая загруженные объекты (identity map) и накопленные изменения до flush/commit; в SQLAlchemy 2.0 единый стиль select(...) работает и для ORM-объектов, и для Core-выражений, в отличие от устаревшего session.query(...).
Пример кода
example.py
from sqlalchemy import select
from sqlalchemy.orm import Session
with Session(engine) as session:
stmt = select(User).where(User.email == "alice@example.com")
user = session.scalars(stmt).first()
if user is None:
raise ValueError("User not found")
print(user.name)Что использовать на практике
- Практика. Сессию обычно открывают на время одного логического юнита работы (например, одного HTTP-запроса) и закрывают/коммитят в конце; удобно использовать with Session(engine) as session: — сессия закроется даже при исключении.
Подводные камни
- Ошибка. Держат сессию открытой на всё время жизни приложения как глобальный singleton, что приводит к устаревшим данным в identity map и утечкам соединений; забывают обработать исключение и оставляют сессию в «грязном» состоянии без rollback.