Create SQLModel database models with proper fields, relationships, and indexes. Use when defining database tables, adding columns, or creating migrations.
Create database models following the TodoList Pro patterns.
# app/models/{resource}.py
from datetime import datetime, timezone
from typing import Optional
from uuid import UUID
from sqlmodel import SQLModel, Field
from uuid6 import uuid7
class {Resource}(SQLModel, table=True):
__tablename__ = "{resources}"
# Primary key - UUID7 for time-ordered IDs
id: UUID = Field(default_factory=uuid7, primary_key=True)
# User ownership (always index for isolation queries)
user_id: str = Field(index=True)
# Core fields
title: str = Field(min_length=1, max_length=200)
description: Optional[str] = Field(default=None, max_length=2000)
# Status fields
is_active: bool = Field(default=True)
# Timestamps
created_at: datetime = Field(
default_factory=lambda: datetime.now(timezone.utc)
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(timezone.utc)
)
# app/models/task.py
class Task(SQLModel, table=True):
__tablename__ = "tasks"
id: UUID = Field(default_factory=uuid7, primary_key=True)
task_number: int = Field(index=True) # Short ID (1000-9999)
user_id: str = Field(index=True)
text: str = Field(min_length=1, max_length=500)
description: Optional[str] = Field(default=None, max_length=2000)
completed: bool = Field(default=False)
completed_at: Optional[datetime] = None
deadline: Optional[datetime] = None
order: int = Field(default=0)
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
# app/models/conversation.py
class Conversation(SQLModel, table=True):
__tablename__ = "conversations"
id: UUID = Field(default_factory=uuid7, primary_key=True)
user_id: str = Field(unique=True, index=True) # One per user
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
# app/models/message.py
from sqlalchemy import Column, String
class Message(SQLModel, table=True):
__tablename__ = "messages"
id: UUID = Field(default_factory=uuid7, primary_key=True)
conversation_id: UUID = Field(foreign_key="conversations.id", index=True)
user_id: str = Field(index=True)
role: str = Field(sa_column=Column(String(50))) # "user" or "assistant"
content: str = Field(max_length=10000)
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
# app/models/notification.py
class Notification(SQLModel, table=True):
__tablename__ = "notifications"
id: UUID = Field(default_factory=uuid7, primary_key=True)
user_id: str = Field(index=True)
task_id: Optional[UUID] = Field(default=None, index=True)
type: str # "deadline_reminder", "deadline_reached", "task_overdue", "system"
title: str = Field(max_length=200)
message: str = Field(max_length=1000)
status: str = Field(default="pending") # "pending", "sent", "read", "dismissed"
read_at: Optional[datetime] = None
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
from sqlmodel import Field
from typing import Optional
from uuid import UUID
from datetime import datetime
# Required string with length limits