protean snapshot
The protean snapshot command group manages snapshots for event-sourced
aggregates. Snapshots capture aggregate state at a point in time to optimize
hydration performance, instead of replaying the entire event history, the
aggregate is loaded from the latest snapshot and only subsequent events are
replayed.
While Protean auto-creates snapshots when the event count exceeds the
snapshot_threshold (default 10), manual snapshot creation is useful for:
- Admin maintenance: Force snapshot creation after data migrations or bulk event imports
- Performance tuning: Pre-warm snapshots for hot aggregates before they are loaded
- Threshold bypass: Create snapshots for aggregates with fewer events than the threshold
All commands accept a --domain option to specify the domain module path
(defaults to the current directory).
Commands
| Command | Description |
|---|---|
protean snapshot create |
Create snapshots for event-sourced aggregates |
protean snapshot create
Creates snapshots for event-sourced aggregates. Supports three modes:
Single aggregate instance
protean snapshot create --domain=my_domain --aggregate=User --identifier=abc-123
Creates a snapshot for one specific aggregate instance. The snapshot is reconstructed from the full event stream regardless of whether a snapshot already exists (forced refresh).
All instances of one aggregate
protean snapshot create --domain=my_domain --aggregate=User
Discovers all instances of the specified aggregate and creates a snapshot for each.
All event-sourced aggregates
protean snapshot create --domain=my_domain
Creates snapshots for every instance of every event-sourced aggregate registered in the domain.
Options
| Option | Description | Default |
|---|---|---|
--domain |
Domain module path | . (current directory) |
--aggregate |
Aggregate class name (e.g. User) |
All ES aggregates |
--identifier |
Specific aggregate identifier (requires --aggregate) |
All instances |
Output
# Single instance:
Snapshot created for User with identifier abc-123.
# All instances of one aggregate:
Created 42 snapshot(s) for User.
# All event-sourced aggregates:
User: 42 snapshot(s)
Order: 15 snapshot(s)
Created 57 snapshot(s) across 2 aggregate(s).
Error Handling
| Condition | Behavior |
|---|---|
--identifier without --aggregate |
Aborts with error message |
| Invalid domain path | Aborts with "Error loading Protean domain" |
| Aggregate not found in registry | Aborts with "not found in domain" |
| Non-event-sourced aggregate | Aborts with "not an event-sourced aggregate" |
| No events for identifier | Aborts with "does not exist" |
| No ES aggregates in domain | Prints informational message |
Domain Discovery
The protean snapshot commands use the same domain discovery mechanism as
protean server. The --domain option accepts:
- A Python module path:
my_package.domain - A file path:
src/my_domain.py - A module with instance name:
my_domain:custom_domain .(default): Searches the current directory
See Domain Discovery for the full resolution logic.
Programmatic API
The same functionality is available as Domain methods for use in scripts or
the protean shell:
# Single aggregate instance
domain.create_snapshot(User, "abc-123")
# All instances of one aggregate
count = domain.create_snapshots(User)
# All event-sourced aggregates
results = domain.create_all_snapshots() # {"User": 42, "Order": 15}