Capítulo 20: Projeto Final - CRUD Completo com FastAPI 🏆🎮

Parabéns por chegar ao último capítulo! No curso de Java, concluímos com um projeto completo usando Spring Boot. Aqui no Python, vamos fechar com chave de ouro criando um CRUD completo (Create, Read, Update, Delete) usando FastAPI e SQLite, com o tema Brawl Stars!


📖 O que é um CRUD?

É o acrônimo para as quatro operações básicas de um banco de dados:

  • Create (Criar/Inserir) Método POST
  • Read (Ler/Consultar) Método GET
  • Update (Atualizar) Método PUT
  • Delete (Apagar) Método DELETE

📖 Exemplo Guiado: Gerenciamento de Brawlers

Vamos criar uma API completa para gerenciar os personagens (Brawlers) do jogo. O FastAPI brilha aqui porque valida os dados de entrada automaticamente usando classes (Pydantic).

  1. Crie o arquivo criar_banco_brawl.py na pasta src/:
import sqlite3
 
def init_db():
    conn = sqlite3.connect('brawl.db')
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS brawlers (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        nome TEXT,
        raridade TEXT
    )
    ''')
    conn.commit()
    conn.close()
 
if __name__ == '__main__':
    init_db()
    print("Banco brawl.db pronto!")
  1. Crie o arquivo app_brawl.py na pasta src/:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import sqlite3
 
app = FastAPI()
 
# Definindo o modelo de dados para validação (Schema)
class BrawlerSchema(BaseModel):
    nome: str
    raridade: str
 
def conectar():
    return sqlite3.connect('brawl.db')
 
# 1. READ (Listar todos)
@app.get('/brawlers')
def listar():
    conn = conectar()
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM brawlers")
    resultados = cursor.fetchall()
    conn.close()
    
    lista = [{"id": r[0], "nome": r[1], "raridade": r[2]} for r in resultados]
    return lista
 
# 2. CREATE (Inserir novo)
@app.post('/brawlers', status_code=201)
def criar(brawler: BrawlerSchema):
    conn = conectar()
    cursor = conn.cursor()
    cursor.execute("INSERT INTO brawlers (nome, raridade) VALUES (?, ?)", (brawler.nome, brawler.raridade))
    conn.commit()
    conn.close()
    
    return {"mensagem": "Brawler cadastrado com sucesso!"}
 
# 3. DELETE (Apagar)
@app.get('/brawlers/deletar/{id}') # Simplificado para teste fácil no navegador
def apagar(id: int):
    conn = conectar()
    cursor = conn.cursor()
    cursor.execute("DELETE FROM brawlers WHERE id = ?", (id,))
    conn.commit()
    conn.close()
    
    return {"mensagem": "Brawler deletado!"}

(Nota: Usei GET para a rota de deletar apenas para facilitar o teste direto no navegador pelos alunos, embora o padrão correto para APIs seja o método DELETE).

🕹️ Como Executar e Testar no VS Code

  1. Rode o criar_banco_brawl.py.
  2. Rode o servidor: uvicorn app_brawl:app --reload
  3. Para testar o GET, acesse http://127.0.0.1:8000/brawlers.
  4. O FastAPI tem um recurso incrível! Acesse http://127.0.0.1:8000/docs para ver a documentação interativa da sua API gerada automaticamente! Você pode testar o POST por lá mesmo!

📊 Ilustração Visual: As Operações do CRUD

Veja como as rotas mapeiam para as operações do banco:

graph TD
    A["Cliente / Navegador"] -->|GET /brawlers| B["Read: SELECT"]
    A -->|POST /brawlers| C["Create: INSERT"]
    A -->|GET /brawlers/deletar/id| D["Delete: DELETE"]
    B --> E[(🗄️ brawl.db)]
    C --> E
    D --> E

🛠️ Prática Obrigatória 1: Operação de Atualização (Update)

Adicione uma rota para atualizar os dados de um Brawler. Para facilitar o teste, você pode usar uma rota GET como /brawlers/atualizar/{id} que receba parâmetros de query (ex: ?nome=NovoNome&raridade=NovaRari) ou manter o padrão de receber um JSON (mas precisará testar via /docs ou Thunder Client).


🔑 Gabarito de Código

Prática 1: Rota de Update (Padrão JSON via POST/PUT para teste na tela /docs)

@app.post('/brawlers/atualizar/{id}')
def atualizar(id: int, brawler: BrawlerSchema):
    conn = conectar()
    cursor = conn.cursor()
    cursor.execute("UPDATE brawlers SET nome = ?, raridade = ? WHERE id = ?", (brawler.nome, brawler.raridade, id))
    conn.commit()
    conn.close()
    
    return {"mensagem": "Brawler atualizado com sucesso!"}

📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

(Siga o mesmo padrão do Capítulo 01)


Parabéns! Você concluiu o curso de Python criando uma API REST completa com FastAPI. Agora você está pronto para construir o backend de qualquer aplicação!


Capitulo Anterior