Выбор ответа Middle SQLAlchemy 2.0 спрашивают часто обновлено
Ошибка MissingGreenlet в async
Вопрос
В async-эндпоинте после user = await session.get(User, 1) обращение user.orders падает с MissingGreenlet. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ленивая загрузка пытается сделать синхронный запрос; грузить через selectinload. AsyncSession работает поверх синхронного ядра через greenlet, и неявный ленивый запрос при обращении к атрибуту не может выполниться без await.
Варианты ответа
- В async нельзя использовать
relationship, только ручные запросы черезselect - Ленивая загрузка пытается сделать синхронный запрос; грузить через
selectinloadправильный ответ - Не установлен пакет
greenlet, без него async-драйвер не может ждать ответ - У пользователя нет заказов, и 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 ошибок.