fix: add selectinload for GuestPurchase.user/tariff in gift activation

Bare select() without eager loading caused MissingGreenlet when
accessing purchase.user and purchase.tariff in async handler.
This commit is contained in:
c0mrade
2026-03-26 20:45:23 +03:00
parent 3bec6620b6
commit 84357a1e87
+6 -1
View File
@@ -6,6 +6,7 @@ import structlog
from aiogram import Dispatcher, F, types from aiogram import Dispatcher, F, types
from aiogram.types import InaccessibleMessage from aiogram.types import InaccessibleMessage
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import selectinload
from app.database.database import AsyncSessionLocal from app.database.database import AsyncSessionLocal
from app.database.models import GuestPurchase from app.database.models import GuestPurchase
@@ -41,7 +42,11 @@ async def handle_gift_activate(callback: types.CallbackQuery) -> None:
await callback.message.edit_text('⏳ Активируем подарок...', parse_mode=None) await callback.message.edit_text('⏳ Активируем подарок...', parse_mode=None)
async with AsyncSessionLocal() as db: async with AsyncSessionLocal() as db:
result = await db.execute(select(GuestPurchase).where(GuestPurchase.id == purchase_id)) result = await db.execute(
select(GuestPurchase)
.options(selectinload(GuestPurchase.user), selectinload(GuestPurchase.tariff))
.where(GuestPurchase.id == purchase_id)
)
purchase = result.scalars().first() purchase = result.scalars().first()
if not purchase or purchase.user_id is None or purchase.user is None: if not purchase or purchase.user_id is None or purchase.user is None: