103 lines
3.0 KiB
Markdown
103 lines
3.0 KiB
Markdown
# SQLModel Schema Examples
|
|
|
|
**Complete Python/SQLModel schema patterns.**
|
|
|
|
## Basic Model with Multi-Tenant
|
|
|
|
```python
|
|
# app/models/user.py
|
|
from sqlmodel import Field, SQLModel
|
|
from uuid import UUID, uuid4
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
class User(SQLModel, table=True):
|
|
"""User model with multi-tenant isolation."""
|
|
|
|
__tablename__ = "users"
|
|
|
|
# Primary key
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
|
|
# Timestamps (required on all tables)
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
|
updated_at: datetime = Field(
|
|
default_factory=datetime.utcnow,
|
|
sa_column_kwargs={"onupdate": datetime.utcnow}
|
|
)
|
|
|
|
# Multi-tenant (required on all tables)
|
|
tenant_id: UUID = Field(foreign_key="tenants.id", index=True)
|
|
|
|
# User fields
|
|
email_address: str = Field(unique=True, index=True, max_length=255)
|
|
full_name: str = Field(max_length=255)
|
|
hashed_password: str = Field(max_length=255)
|
|
is_active: bool = Field(default=True)
|
|
is_verified: bool = Field(default=False)
|
|
last_login_at: Optional[datetime] = None
|
|
|
|
# Soft delete
|
|
deleted_at: Optional[datetime] = None
|
|
```
|
|
|
|
## Reusable Timestamp Mixin
|
|
|
|
```python
|
|
# app/models/base.py
|
|
from sqlmodel import Field
|
|
from datetime import datetime
|
|
|
|
class TimestampMixin:
|
|
"""Mixin for created_at and updated_at timestamps."""
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
|
updated_at: datetime = Field(
|
|
default_factory=datetime.utcnow,
|
|
sa_column_kwargs={"onupdate": datetime.utcnow}
|
|
)
|
|
|
|
# Use in models
|
|
class Team(TimestampMixin, SQLModel, table=True):
|
|
__tablename__ = "teams"
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
tenant_id: UUID = Field(foreign_key="tenants.id", index=True)
|
|
name: str = Field(max_length=255)
|
|
```
|
|
|
|
## One-to-Many Relationships
|
|
|
|
```python
|
|
# app/models/post.py
|
|
from sqlmodel import Field, SQLModel, Relationship
|
|
from uuid import UUID, uuid4
|
|
from datetime import datetime
|
|
from typing import Optional, List
|
|
|
|
class Post(SQLModel, table=True):
|
|
"""Post model with author relationship."""
|
|
|
|
__tablename__ = "posts"
|
|
|
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
|
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
|
tenant_id: UUID = Field(foreign_key="tenants.id", index=True)
|
|
|
|
# Foreign key to users
|
|
author_id: UUID = Field(foreign_key="users.id", index=True)
|
|
|
|
title: str = Field(max_length=255)
|
|
content: str
|
|
is_published: bool = Field(default=False)
|
|
|
|
# Relationship
|
|
author: Optional["User"] = Relationship(back_populates="posts")
|
|
|
|
# Add to User model
|
|
class User(TimestampMixin, SQLModel, table=True):
|
|
# ... (previous fields)
|
|
posts: List["Post"] = Relationship(back_populates="author")
|
|
```
|
|
|
|
**See [../templates/sqlmodel-table.py](../templates/sqlmodel-table.py) for complete template.**
|