lazy loading and eager loading describe when related data is fetched, regardless of language or framework.
lazy loading defers loading related data until it’s accessed.
# python / sqlalchemy example
user = db.query(User).first()
posts = user.posts # triggers an extra query
pros: minimal upfront work
cons: accidental n+1 queries, especially inside loops
eager loading fetches related data as part of the initial query.
from sqlalchemy.orm import selectinload
user = (
db.query(User)
.options(selectinload(User.posts))
.first()
)
pros: predictable performance, fewer queries
cons: potential overfetching
rule of thumb:
- lazy loading is fine for singular, optional access
- eager loading is safer for lists, APIs, and production traffic