1
resposta

[Projeto] rotas criadas pelo json e banco de dados

from fastapi import FastAPI, HTTPException

import sqlite3

import json

from schemas import Serie
from persistencia import salvar_no_arquivo



app = FastAPI()


#banco de dados json ==================================================================================================

# @app.get("/")
# def home():
#     return {"mensagem": "Catálogo de Séries em construção"}

# @app.post("/series", status_code=201)
# def cadastrar_serie(serie: Serie):

#     dados_serie = serie.model_dump()
    
#     try:
#         salvar_no_arquivo(dados_serie)
#         return {
#             "mensagem": "Série cadastrada com sucesso!",
#             "serie": dados_serie
#         }
    
#     except Exception as e:
#         from fastapi import HTTPException
#         raise HTTPException(status_code=500, detail="Erro interno ao salvar dados")
    
# @app.get("/series", status_code=200)
# def listar_series():
#     with open("series.json", "r") as f:
#         return json.load(f)





#banco de dados sqlite ==================================================================================================

def inicializar_banco():
    conn = sqlite3.connect('series.db')
    cursor = conn.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS series (
            titulo TEXT,
            genero TEXT,
            ano_lancamento INTEGER,
            temporadas INTEGER
        )
    ''')
    conn.commit()
    conn.close()

inicializar_banco()

# CADASTRAR
@app.post("/series/banco_dados", status_code=201)
def cadastrar_serie(serie: Serie):
    conn = sqlite3.connect('series.db')
    cursor = conn.cursor()
    try:
        cursor.execute(
            "INSERT INTO series (titulo, genero, ano_lancamento, temporadas) VALUES (?, ?, ?, ?)",
            (serie.titulo, serie.genero, serie.ano_lancamento, serie.temporadas)
        )
        conn.commit()
        return {"mensagem": "Série cadastrada com sucesso!", "serie": serie}
    except sqlite3.IntegrityError:
        raise HTTPException(status_code=400, detail="Esta série já está cadastrada.")
    finally:
        conn.close()

# LISTAR 
@app.get("/series/banco_dados")
def listar_todas():
    conn = sqlite3.connect('series.db')
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM series")
    linhas = cursor.fetchall()
    conn.close()
    
    resultado = []
    for l in linhas:
        resultado.append({
            "titulo": l[0], "genero": l[1], 
            "ano_lancamento": l[2], "temporadas": l[3]
        })
    return resultado

# BUSCAR POR TÍTULO
@app.get("/series/{titulo}/banco_dados")
def buscar_por_titulo(titulo: str):
    conn = sqlite3.connect('series.db')
    cursor = conn.cursor()

    cursor.execute("SELECT * FROM series WHERE LOWER(titulo) = LOWER(?)", (titulo,))
    linha = cursor.fetchone()
    conn.close()
    
    if not linha:
        raise HTTPException(status_code=404, detail="Série não encontrada.")
    
    return {
        "titulo": linha[0],
        "genero": linha[1],
        "ano_lancamento": linha[2],
        "temporadas": linha[3]
    }
import json

FILE_PATH = "series.json"

def salvar_no_arquivo(nova_serie: dict):
    try:
        with open(FILE_PATH, "r") as f:
            dados = json.load(f)
    except (FileNotFoundError, json.JSONDecodeError):
        dados = []

    dados.append(nova_serie)

    with open(FILE_PATH, "w") as f:
        json.dump(dados, f, indent=4)
from pydantic import BaseModel, Field

class Serie(BaseModel):
    titulo: str = Field(..., min_length=1)
    genero: str = Field(..., min_length=1)
    ano_lancamento: int = Field(..., gt=1900)
    temporadas: int = Field(..., gt=0)
1 resposta

Oi, Andre! Como vai?

Agradeço por compartilhar.

Gostei da forma como você separou as rotas usando JSON e SQLite, isso mostra uma boa evolução na organização da API com FastAPI. Parabéns pela dedicação e continue firme nos estudos.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!