A quem interessar segue a rota do desafio(estudante por id), bem como algumas rotas a mais que criei como objeto de estudos usando IA.
- Eu pedi ajuda da IA para aprender rotas de atualizar(patch) de deletar e tambem a criar o relacionamento entre matriculas e estudantes
- Também usei a IA para me ajudar nas docstrings com explicações de aprendizado e comentários, para que o codigo ficasse mais explicativo, já que a as aulas não foram o suficiente.
@app.get(
"/estudantes/{estudante_id}",
response_model=schemas.EstudanteResponse,
summary="Busca estudante por ID",
description="Retorna os dados de um estudante específico pelo seu identificador",
)
def read_estudante_by_id(estudante_id: int, db: Session = Depends(get_db)):
"""
Busca um estudante específico pelo seu ID.
Eficiência da busca:
- db.get(Model, id): Busca direta por Primary Key (muito rápida)
Padrão de tratamento de erros:
- Se não encontrado, retorna HTTP 404
Retorno:
- Objeto Estudante completo (id, nome, idade)
"""
estudante = db.get(models.Estudante, estudante_id)
if not estudante:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Estudante não encontrado"
)
return estudante
- nos eschemas adicionei esses:
# ATUALIZAÇÃO DE ESTUDANTE
# Não herda de EstudanteBase - não força a criação
# - é opcional, pode atualizar apenas um dos dados
class EstudanteUpdate(BaseModel):
nome: Optional[str] = None
idade: Optional[int] = None
# DELETE GERAL - apenas para retornar uma mensagem
class DeleteResponse(BaseModel):
message: str
- Para models, temos que adicionar os relacionamentos
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from database import Base
class Estudante(Base):
__tablename__ = "estudantes"
# primary_key=True → cria ID + auto incremento + índice automático
# index=True → pede outro índice para BUSCA - redundante
id = Column(Integer, primary_key=True, index=True)
nome = Column(String(100), nullable=False)
idade = Column(Integer)
# RELACIONAMENTO
disciplinas = relationship("Matricula", back_populates="estudante")
class Matricula(Base):
__tablename__ = "matriculas"
id = Column(Integer, primary_key=True, index=True)
estudante_id = Column(Integer, ForeignKey("estudantes.id"))
nome_disciplina = Column(String(100), nullable=False)
# RELACIONAMENTO
estudante = relationship("Estudante", back_populates="disciplinas")
- rotas update e delete para alunos. Como as rotas de matricula são iguais as rotas que foram criadas em aula, não vou postar pois a resposta esta grande.
@app.patch(
"/estudantes/{estudante_id}",
response_model=schemas.EstudanteResponse,
)
def update_estudantes(
estudante_id: int,
estudante_data: schemas.EstudanteUpdate,
db: Session = Depends(get_db),
):
"""
Atualiza parcialmente os dados de um estudante existente.
Uso de PATCH vs PUT:
- PATCH: Atualiza apenas campos enviados (parcial)
- PUT: Substitui todo o recurso (completo)
Vantagens do exclude_unset=True:
- Permite atualizar apenas nome OU idade
- Não precisa enviar todos os campos obrigatórios
- Campos omitidos mantêm valores originais
"""
estudante = db.get(models.Estudante, estudante_id)
if not estudante:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Estudante não encontrado"
)
update_data = estudante_data.model_dump(exclude_unset=True)
# Atualiza apenas os campos enviados
# setattr(objeto, campo, valor): Atualiza atributo dinamicamente
for field, value in update_data.items():
setattr(estudante, field, value)
# Persiste as mudanças
db.commit()
db.refresh(estudante)
return estudante
@app.delete(
"/estudantes/{estudante_id}",
response_model=schemas.DeleteResponse,
summary="Remove um estudante",
description="Exclui permanentemente um estudante do banco de dados",
)
def delete_estudante(estudante_id: int, db: Session = Depends(get_db)):
"""
Remove um estudante do banco de dados permanentemente.
Considerações importantes:
- Operação irreversível
- Em produção, considere exclusão lógica (campo 'ativo' = False)
- Pode afetar matrículas relacionadas (depende das constraints do banco)
"""
estudante = db.get(models.Estudante, estudante_id)
if not estudante:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Estudante não encontrado"
)
# Remove do banco de dados
db.delete(estudante)
db.commit()
# Retorna mensagem de confirmação
return {"message": "Estudante foi excluido com sucesso."}