🧩 Exercícios: Mapeamento ORM com SQLModel e Modelos Declarativos
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:
- Declarar entidade
Usuarioherdando deSQLModel, table=Truecom camposid,email,nomeecriado_em.
Resultado Esperado
Tabela de usuários mapeada com schema declarativo SQLModel.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_05_1_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_05_2_SeuNome - 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:
- Configurar
create_enginee executarSQLModel.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)
- Salve o arquivo como:
Atividade_05_3_SeuNome - 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:
- Configurar engine com
pool_size=10,max_overflow=20epool_recycle=1800para alta vazão.
Resultado Esperado
Pool de conexões corporativo configurado com reciclagem a cada 30 minutos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_05_4_SeuNome - 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())