Bird
Raised Fist0
Flaskframework~5 mins

Lazy loading vs eager loading in Flask

Choose your learning style10 modes available
Introduction

Lazy loading and eager loading help control when data is fetched from the database. This makes your app faster and uses less memory.

When you want to load related data only if it is needed to save time and memory.
When you know you will need all related data upfront and want to get it in one go.
When working with large datasets and want to avoid loading everything at once.
When optimizing database queries to reduce the number of calls.
When building web pages that show related information together.
Syntax
Flask
from sqlalchemy.orm import joinedload

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    children = db.relationship('Child', lazy='select')  # lazy loading

# For eager loading:
parent = Parent.query.options(joinedload(Parent.children)).first()

lazy='select' means children are loaded only when accessed.

joinedload() fetches related data in the same query (eager loading).

Examples
This is lazy loading. Children load only when you ask for them.
Flask
children = db.relationship('Child', lazy='select')
This is eager loading. Children load immediately with the parent.
Flask
children = db.relationship('Child', lazy='joined')
Use this to eagerly load children when querying the parent.
Flask
parent = Parent.query.options(joinedload(Parent.children)).first()
Sample Program

This example shows lazy loading where children load only when accessed, and eager loading where children load with the parent query.

Flask
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import joinedload

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
db = SQLAlchemy(app)

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    children = db.relationship('Child', lazy='select')  # lazy loading

class Child(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))

with app.app_context():
    db.create_all()
    p = Parent(name='Parent1')
    c1 = Child(name='Child1', parent=p)
    c2 = Child(name='Child2', parent=p)
    db.session.add_all([p, c1, c2])
    db.session.commit()

    # Lazy loading: children are not loaded until accessed
    parent = Parent.query.first()
    print('Parent:', parent.name)
    print('Children:', [child.name for child in parent.children])

    # Eager loading: load children with parent in one query
    parent_eager = Parent.query.options(joinedload(Parent.children)).first()
    print('Parent eager:', parent_eager.name)
    print('Children eager:', [child.name for child in parent_eager.children])
OutputSuccess
Important Notes

Lazy loading saves memory but can cause extra database queries later.

Eager loading uses more memory upfront but reduces the number of queries.

Choose based on your app's needs and data size.

Summary

Lazy loading waits to load related data until you ask for it.

Eager loading loads related data immediately with the main data.

Use lazy loading to save resources and eager loading to reduce queries.

Practice

(1/5)
1. What is the main difference between lazy loading and eager loading in Flask ORM?
easy
A. Lazy loading is faster than eager loading in all cases.
B. Lazy loading loads all data at once; eager loading loads data in parts.
C. Lazy loading delays loading related data until accessed; eager loading loads it immediately.
D. Eager loading delays loading related data until accessed; lazy loading loads it immediately.

Solution

  1. Step 1: Understand lazy loading behavior

    Lazy loading means related data is not loaded until you specifically ask for it, saving resources initially.
  2. Step 2: Understand eager loading behavior

    Eager loading means related data is loaded immediately with the main query, reducing the number of queries later.
  3. Final Answer:

    Lazy loading delays loading related data until accessed; eager loading loads it immediately. -> Option C
  4. Quick Check:

    Lazy vs eager loading = delay vs immediate load [OK]
Hint: Lazy waits, eager loads now. Remember delay vs immediate [OK]
Common Mistakes:
  • Confusing which one loads data immediately
  • Thinking lazy loading loads all data at once
  • Assuming eager loading is always slower
2. Which of the following is the correct syntax to use eager loading with SQLAlchemy in Flask?
easy
A. query.load_later(Model.related)
B. query.lazyload(Model.related)
C. query.eager(Model.related)
D. query.options(joinedload(Model.related))

Solution

  1. Step 1: Identify eager loading syntax in SQLAlchemy

    SQLAlchemy uses joinedload() inside options() to eagerly load related data.
  2. Step 2: Check other options for correctness

    lazyload is for lazy loading, eager and load_later are not valid methods.
  3. Final Answer:

    query.options(joinedload(Model.related)) -> Option D
  4. Quick Check:

    Eager loading = options(joinedload()) [OK]
Hint: Eager loading uses options(joinedload()) in SQLAlchemy [OK]
Common Mistakes:
  • Using lazyload instead of joinedload for eager loading
  • Trying non-existent methods like eager()
  • Confusing method names for loading strategies
3. Given the code below, what will be the output when accessing user.posts if lazy='select' is used?
user = session.query(User).first()
print(user.posts)
medium
A. A list of posts is loaded only when user.posts is accessed.
B. All posts are loaded immediately with the user query.
C. An error occurs because posts are not loaded.
D. Posts are never loaded even when accessed.

Solution

  1. Step 1: Understand lazy='select' behavior

    Lazy loading with 'select' means related posts are loaded only when accessed, not with the initial query.
  2. Step 2: Analyze code behavior

    When user.posts is printed, a separate query fetches posts at that moment.
  3. Final Answer:

    A list of posts is loaded only when user.posts is accessed. -> Option A
  4. Quick Check:

    lazy='select' = load on access [OK]
Hint: Lazy='select' loads related data only when accessed [OK]
Common Mistakes:
  • Assuming posts load with user query
  • Expecting error due to missing posts
  • Thinking posts never load
4. Identify the error in this Flask SQLAlchemy code snippet using eager loading:
user = session.query(User).options(lazyload(User.posts)).first()
print(user.posts)
medium
A. Calling print before loading posts.
B. Using lazyload instead of joinedload for eager loading.
C. Incorrect model name used in query.
D. Missing filter() before first().

Solution

  1. Step 1: Check loading option used

    The code uses lazyload, which triggers lazy loading, not eager loading.
  2. Step 2: Identify correct eager loading method

    For eager loading, joinedload should be used inside options().
  3. Final Answer:

    Using lazyload instead of joinedload for eager loading. -> Option B
  4. Quick Check:

    Eager loading requires joinedload, not lazyload [OK]
Hint: Eager loading needs joinedload, not lazyload [OK]
Common Mistakes:
  • Confusing lazyload and joinedload
  • Thinking lazyload triggers eager loading
  • Ignoring loading strategy in options()
5. You have a Flask app with a User model and a related Post model. You want to display all users with their posts efficiently. Which approach best balances performance and resource use?
hard
A. Use eager loading with joinedload to load users and posts in one query.
B. Use lazy loading and access posts inside a loop, causing many queries.
C. Load posts separately after loading all users, doubling queries.
D. Avoid loading posts to save resources, showing empty post lists.

Solution

  1. Step 1: Consider performance needs

    Loading users and posts in one query reduces database hits and improves speed.
  2. Step 2: Compare loading strategies

    Lazy loading inside a loop causes many queries (N+1 problem), and loading posts separately doubles queries.
  3. Step 3: Evaluate resource use

    Eager loading with joinedload balances resource use and query count efficiently.
  4. Final Answer:

    Use eager loading with joinedload to load users and posts in one query. -> Option A
  5. Quick Check:

    Eager loading with joinedload = efficient queries [OK]
Hint: Eager loading with joinedload avoids many queries [OK]
Common Mistakes:
  • Using lazy loading causing many queries
  • Loading posts separately doubling queries
  • Skipping posts causing empty data
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard