1
resposta

RESPOSTA: 11 Desafio: Criando rotas no FastAPI e outra rotas

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."}
1 resposta

Olá, Thaís, tudo bem?

Simplesmente uau!

Parabéns pela iniciativa de ir muito além do proposto no desafio. Essa atitude de usar a aula como base e buscar a IA para expandir o conhecimento (implementando PATCH, DELETE e Relacionamentos) é exatamente o que diferencia profissionais que evoluem rápido na carreira.

Ficou excelente a sua implementação!

Continue com essa curiosidade e aprofundamento! O código está muito profissional.

Bons estudos!

Sucesso

Imagem da comunidade