Skip to content

Quick Start

This guide will walk you through creating your first RestMachine ORM models and performing basic operations.

Your First Model

Let's create a simple User model:

from typing import ClassVar
from restmachine_orm import Model, Field
from restmachine_orm.backends import InMemoryBackend, InMemoryAdapter

class User(Model):
    """A simple user model."""

    model_backend: ClassVar = InMemoryBackend(InMemoryAdapter())

    id: str = Field(primary_key=True)
    email: str = Field(unique=True, index=True)
    name: str
    age: int = Field(ge=0, le=150, default=0)

Key points: - Models inherit from Model - Use Pydantic's Field for metadata - Configure backend using model_backend ClassVar - At least one field must be marked primary_key=True

Create Records

# Create a user
user = User.create(
    id="user-1",
    email="alice@example.com",
    name="Alice Smith",
    age=30
)

print(f"Created user: {user.name}")
# Output: Created user: Alice Smith

Read Records

# Get by primary key
user = User.get(id="user-1")
if user:
    print(f"Found: {user.email}")

# Query with filters
users = User.where().and_(age__gte=25).all()
for user in users:
    print(f"{user.name} is {user.age} years old")

Update Records

# Get the user
user = User.get(id="user-1")

# Update fields
user.age = 31
user.name = "Alice Jones"

# Save changes
user.save()

Delete Records

# Get the user
user = User.get(id="user-1")

# Delete
success = user.delete()
if success:
    print("User deleted")

# Verify deletion
user = User.get(id="user-1")
print(user)  # Output: None

Complete Example

Here's a complete working example:

from restmachine_orm import Model, Field
from restmachine_orm.backends import InMemoryBackend, InMemoryAdapter
from typing import ClassVar

# Define model
class TodoItem(Model):
    model_backend: ClassVar = InMemoryBackend(InMemoryAdapter())

    id: str = Field(primary_key=True)
    title: str = Field(min_length=1, max_length=200)
    completed: bool = False
    priority: int = Field(ge=1, le=5, default=3)

# Create todos
todo1 = TodoItem.create(
    id="todo-1",
    title="Write documentation",
    priority=5
)

todo2 = TodoItem.create(
    id="todo-2",
    title="Write tests",
    priority=4,
    completed=True
)

todo3 = TodoItem.create(
    id="todo-3",
    title="Deploy to production",
    priority=5
)

# Query incomplete high-priority items
urgent_todos = TodoItem.where() \
    .and_(completed=False) \
    .and_(priority__gte=4) \
    .order_by("-priority") \
    .all()

print("Urgent incomplete todos:")
for todo in urgent_todos:
    print(f"  [{todo.priority}] {todo.title}")

# Output:
# Urgent incomplete todos:
#   [5] Write documentation
#   [5] Deploy to production

# Complete a todo
todo1.completed = True
todo1.save()

# Count completed
completed_count = TodoItem.where().and_(completed=True).count()
print(f"\nCompleted: {completed_count} todos")
# Output: Completed: 2 todos

Next Steps