GraphQL gibt dem Client die Kontrolle darüber, welche Daten er benötigt. Ein Endpunkt, kein Over-Fetching.
Schema und Resolvers — Python¶
import strawberry from strawberry.fastapi import GraphQLRouter @strawberry.type class User: id: int name: str email: str @strawberry.type class Query: @strawberry.field async def users(self) -> list[User]: return await db.users.find_all() @strawberry.field async def user(self, id: int) -> User | None: return await db.users.find(id) schema = strawberry.Schema(Query) app.include_router(GraphQLRouter(schema), prefix=”/graphql”)
DataLoader — Lösung des N+1-Problems¶
from strawberry.dataloader import DataLoader async def load_users(ids: list[int]) -> list[User]: users = await db.users.find_many(ids) return [next(u for u in users if u.id == id) for id in ids] user_loader = DataLoader(load_fn=load_users)
Wichtigste Erkenntnis¶
GraphQL für komplexe Frontend-Anforderungen. DataLoader löst das N+1-Problem. REST für einfaches CRUD.