Exercício de Sala: API de Alunos e Tarefas

Ícone de Desafio

Desafio da Aula

Agora o foco será modelar dados relacionados com SQLModel e expor essas informações por meio de uma API. Você irá criar um sistema simples de alunos e tarefas, com relacionamento entre as tabelas.

Tarefa:

Seu objetivo será implementar o modelo SQL, e a API para gerenciar alunos e suas tarefas.

Para te ajudar neste processo, ao final do enunciado, você encontrará um template para o seu arquivo de modelos SQLModel, e um outro template para sua API.

Para executar os testes, você poderá utilizar o docs oferecido pelo próprio FastAPI

1. Modelagem com SQLModel

Estruture os modelos e o relacionamento no banco de dados

Você deverá modelar apenas 1 tabela, com os seguintes parâmetros:

Para facilitar, a propriedade do ID já foi implementada em uma tabela, e na outra, a tarefa já está totalmente implementada, segue um template do código que você deverá completar:

from typing import List 
# Este import será importante em algum lugar...
# Dica: Olhe as outras dicas : D


from sqlmodel import Field, Relationship, SQLModel


class Aluno(SQLModel, table=True):
    nusp: int | None = Field(default=None, primary_key=True)
    # Implemente aqui os registros para o nome e idade do aluno.
    
    #Atente-se a como a tarefa referência os alunos.
    # 
    # É só uma tarefa, ou são várias tarefas? 
    # Pelo modelo de Tarefa, devemos preparar algo a mais
    # para que possamos pegar o aluno pela tarefa?
    
    # A dica está nos imports.


class Tarefa(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    nome: str
    duracao: int
    aluno_nusp: int = Field(foreign_key="aluno.nusp")

    aluno: Aluno = Relationship(back_populates="tarefas")
    # Dica numero 2: 
    # "tarefas" deve ser o nome do atributo 
    # que representa a relação no modelo Aluno

2. Implementação da API

Implemente as rotas necessárias para cadastrar e consultar os dados:

Para adiantar a configuração básica, use o template abaixo com a estrutura básica já feita, e algumas outras funções que poderão ser usadas como referência:

from fastapi import FastAPI
from sqlmodel import Session, select, SQLModel, create_engine
from models import Aluno, Tarefa

arquivo_sqlite = "exercicio_7.db"
url_sqlite = f"sqlite:///{arquivo_sqlite}"

engine = create_engine(url_sqlite)

def create_db_and_tables():
    SQLModel.metadata.create_all(engine)

app = FastAPI()


@app.on_event("startup")
def on_startup() -> None:
    create_db_and_tables()

@app.post("/alunos")
def criar_aluno(aluno: Aluno):
    with Session(engine) as session:
        # Implemente aqui os comandos para adicionar, salvar e depois
        # como resposta da API:
        # retorne o objeto aluno da forma em que ele foi salvo no banco de dados.


@app.post("/tarefas")
def criar_tarefa(tarefa: Tarefa):
    with Session(engine) as session:
        session.add(tarefa)
        session.commit()
        session.refresh(tarefa)
        return tarefa


@app.get("/alunos")
def listar_alunos():
    with Session(engine) as session:
        # Implemente aqui o comando para retornar: 
        # A lista de TODOS os alunos 
        # cadastrados no banco de dados.


@app.get("/tarefas")
def listar_tarefas():
    with Session(engine) as session:
        return session.exec(select(Tarefa)).all()

@app.get("/alunos/{aluno_nusp}/tarefas")
def listar_tarefas_do_aluno(aluno_nusp: int):
    with Session(engine) as session:
        # Implemente aqui os comandos para retornar: 
        # A lista de tarefas associadas a um aluno.

        # você pode fazer esta consulta tanto
        # através da estruturação de uma consulta normal SQL,
        # quanto simplesmente pegando o Aluno
        # e retornando a propriedade implementada anteriormente.

Entregue um arquivo para os modelos e o arquivo da API utilizando destes modelos.