В чем отличия между версиями SQLAlchemy
PythonSQLAlchemyбиблиотекиверсиифреймворки
Что проверяют
Работали ли вы с современной версией или пишете по статьям десятилетней давности. Разрыв между стилем 1.x и 2.0 заметный, и по ответу это сразу видно.
Как отвечать
Главный рубеж это переход к стилю 2.0, который появился в версии 1.4 и стал единственным в 2.0.
Что изменилось:
- единый способ запроса: вместо
session.query(User).filter(...)пишутsession.execute(select(User).where(...))и получаютResult, из которого берутscalars().all(). СтарыйQueryв 2.0 объявлен устаревшим, хотя пока работает; - декларативные модели:
declarative_base()уступил место классуDeclarativeBase, а колонки описываются черезMapped[int]иmapped_column(...). Это даёт настоящую проверку типов, чего в 1.x не было; - асинхронность: с 1.4 появились
create_async_engineиAsyncSession, то есть ORM стало можно использовать в асинхронных приложениях с драйвером вродеasyncpg; - строгая работа с соединениями: неявное автоподключение убрано, транзакции начинаются явно, автокоммит на уровне подключения исчез;
- ленивая загрузка в асинхронном режиме запрещена: обращение к невыгруженной связи бросает ошибку, поэтому используют
selectinloadиjoinedloadзаранее.
Полезно добавить практический совет по миграции: в 1.4 включают флаг SQLALCHEMY_WARN_20, переводят код по частям, а затем поднимают версию до 2.0.
Где спотыкаются
Пишут в стиле 1.x на проекте с 2.0 и получают предупреждения об устаревании.
Не знают, что в асинхронном режиме ленивые связи не работают, и ловят ошибку уже в бою.
Путают SQLAlchemy Core и ORM: select() из Core работает и без моделей, и в 2.0 это один и тот же интерфейс.