Skip to content

Bulk Operations

Aksara's ORM provides high-performance bulk operations for efficiently managing large datasets. These operations minimize database roundtrips and utilize PostgreSQL-native features for atomicity and speed.


Bulk Create

Insert thousands of records efficiently with automatic batching.

# Create 10,000 user instances in memory
users_to_create = [
    User(email=f"user{i}@example.com", name=f"User {i}")
    for i in range(10000)
]

# Batch insert (1000 per batch by default)
created_users = await User.objects.bulk_create(
    users_to_create,
    batch_size=1000
)

# ✅ This performs 10 queries (batching 1000 items each)
# ❌ Instead of 10,000 individual INSERT queries

Ignoring Conflicts

If you want to skip records that violate unique constraints instead of raising exceptions, use ignore_conflicts=True. This utilizes PostgreSQL's ON CONFLICT DO NOTHING.

# If email is unique and some duplicates exist, skip them silently
created = await User.objects.bulk_create(
    users,
    ignore_conflicts=True
)

# Returns only successfully inserted records

Bulk Update

Update thousands of records efficiently using PostgreSQL CASE statements.

# Mark all unpublished posts as published
posts = await Post.objects.filter(status="draft").all()

# Modify instances in memory
for post in posts:
    post.status = "published"
    post.updated_at = datetime.now()

# Batch update all at once
updated_count = await Post.objects.bulk_update(
    posts,
    fields=['status', 'updated_at'],
    batch_size=1000
)

print(f"Updated {updated_count} posts")

Upsert (Insert or Update)

Perform an insert if a record is new, or update it if it already exists based on unique constraints.

Uses PostgreSQL's native ON CONFLICT DO UPDATE for atomicity and performance.

# Upsert: Insert if new, update if exists (by email)
user, created = await User.objects.upsert(
    email="john@example.com",  # Unique key for conflict detection
    defaults={'name': 'John Doe', 'is_active': True},  # Values for creation
    update_fields=['name', 'updated_at']  # Fields to update on conflict
)

if created:
    print(f"Created new user: {user.email}")
else:
    print(f"Updated existing user: {user.email}")

If update_fields is omitted, all fields specified in defaults will be updated on conflict.