from typing import List, Optional from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from sqlalchemy.orm import selectinload from app.models.route import Route from app.schemas.route import RouteCreate from geoalchemy2.shape import from_shape from shapely.geometry import shape class CRUDRoute: async def get_by_peak(self, db: AsyncSession, peak_id: int) -> List[Route]: # Use selectinload to fetch related camps efficiently result = await db.execute( select(Route) .filter(Route.peak_id == peak_id) .options(selectinload(Route.camps)) ) return result.scalars().all() async def create(self, db: AsyncSession, *, obj_in: RouteCreate) -> Route: geom_wkt = from_shape(shape(obj_in.path_geometry), srid=4326) db_obj = Route( peak_id=obj_in.peak_id, name=obj_in.name, difficulty=obj_in.difficulty, description=obj_in.description, is_standard_route=obj_in.is_standard_route, path_geometry=geom_wkt ) db.add(db_obj) await db.commit() await db.refresh(db_obj) return db_obj route = CRUDRoute()