Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 05.1 — Definição de Entidade SQLModel com Chave Primária e Campos Opcionais

Contexto: Definição de Entidade SQLModel com Chave Primária e Campos Opcionais no contexto de Mapeamento ORM com SQLModel e Modelos Declarativos.

Requisitos de Execução:

  1. Declarar entidade Usuario herdando de SQLModel, table=True com campos id, email, nome e criado_em.

Resultado Esperado

Tabela de usuários mapeada com schema declarativo SQLModel.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_1_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - Mapeamento ORM com SQLModel e Modelos Declarativos
🔑 Gabarito de Código & Solução Comentada
# models.py
from sqlmodel import SQLModel, Field
from typing import Optional
from datetime import datetime

class Usuario(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    nome: str = Field(index=True, max_length=100)
    email: str = Field(unique=True, index=True)
    ativo: bool = Field(default=True)
    criado_em: datetime = Field(default_factory=datetime.utcnow)

user = Usuario(nome="Carlos Silva", email="carlos@empresa.com")
print("Modelo instanciado:", user.nome, user.email)

🔍 Nível 2: Prática

Problema 05.2 — Separação de Schemas: ModelBase, ModelCreate e ModelRead

Contexto: Separação de Schemas: ModelBase, ModelCreate e ModelRead no contexto de Mapeamento ORM com SQLModel e Modelos Declarativos.

Requisitos de Execução:

  1. Criar hierarquia de schemas para evitar expor senhas hash em respostas da API.

Resultado Esperado

Senha hash isolada no banco | ModelRead retorna apenas dados públicos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_2_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - Mapeamento ORM com SQLModel e Modelos Declarativos
🔑 Gabarito de Código & Solução Comentada
# user_schemas.py
from sqlmodel import SQLModel, Field
from typing import Optional

class UsuarioBase(SQLModel):
    nome: str
    email: str

class UsuarioCreate(UsuarioBase):
    senha_plana: str

class UsuarioRead(UsuarioBase):
    id: int
    ativo: bool

class UsuarioDB(UsuarioBase, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    senha_hash: str
    ativo: bool = True

u_read = UsuarioRead(id=1, nome="Ana", email="ana@tech.com", ativo=True)
print("Schema de Leitura Seguro:", u_read.model_dump())

⚡ Nível 3: Integração

Problema 05.3 — Inicialização de Engine SQLite/PostgreSQL e Criação Automática de Tabelas

Contexto: Inicialização de Engine SQLite/PostgreSQL e Criação Automática de Tabelas no contexto de Mapeamento ORM com SQLModel e Modelos Declarativos.

Requisitos de Execução:

  1. Configurar create_engine e executar SQLModel.metadata.create_all(engine) em banco em memória.

Resultado Esperado

Engine inicializado e tabelas criadas no SQLite in-memory.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_3_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - Mapeamento ORM com SQLModel e Modelos Declarativos
🔑 Gabarito de Código & Solução Comentada
# db_engine.py
from sqlmodel import SQLModel, create_engine, Session

sqlite_url = "sqlite:///:memory:"
engine = create_engine(sqlite_url, echo=False)

def inicializar_banco():
    SQLModel.metadata.create_all(engine)
    print("Tabelas criadas com sucesso no SQLite em memória.")

inicializar_banco()

🏆 Nível 4: Desafio Corporativo

Problema 05.4 — Configuração de Conexão com Pooling e Parâmetros de Timeout

Contexto: Configuração de Conexão com Pooling e Parâmetros de Timeout no contexto de Mapeamento ORM com SQLModel e Modelos Declarativos.

Requisitos de Execução:

  1. Configurar engine com pool_size=10, max_overflow=20 e pool_recycle=1800 para alta vazão.

Resultado Esperado

Pool de conexões corporativo configurado com reciclagem a cada 30 minutos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_05_4_SeuNome
  2. Envie na tarefa: Atividade Cap 05 - Mapeamento ORM com SQLModel e Modelos Declarativos
🔑 Gabarito de Código & Solução Comentada
# enterprise_engine.py
from sqlmodel import create_engine

def criar_engine_corporativo(database_uri: str):
    return create_engine(
        database_uri,
        pool_size=10,
        max_overflow=20,
        pool_recycle=1800,
        pool_pre_ping=True
    )

eng = criar_engine_corporativo("sqlite:///:memory:")
print("Engine Corporativo configurado:", eng.pool.size())