Выбор ответа Middle SQLAlchemy 2.0 спрашивают часто обновлено

Ошибка MissingGreenlet в async

Вопрос

В async-эндпоинте после user = await session.get(User, 1) обращение user.orders падает с MissingGreenlet. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ленивая загрузка пытается сделать синхронный запрос; грузить через selectinload. AsyncSession работает поверх синхронного ядра через greenlet, и неявный ленивый запрос при обращении к атрибуту не может выполниться без await.

Варианты ответа

  1. В async нельзя использовать relationship, только ручные запросы через select
  2. Ленивая загрузка пытается сделать синхронный запрос; грузить через selectinloadправильный ответ
  3. Не установлен пакет greenlet, без него async-драйвер не может ждать ответ
  4. У пользователя нет заказов, и SQLAlchemy бросает исключение вместо пустого списка

Разбор

AsyncSession работает поверх синхронного ядра через greenlet, и неявный ленивый запрос при обращении к атрибуту не может выполниться без await. Решения: select(User).options(selectinload(User.orders)), await session.refresh(user, ["orders"]) или AsyncAttrs с await user.awaitable_attrs.orders. relationship в async работает, если связи загружены явно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме