Especialização em Backend com Python & FastAPI • Demonstrações Práticas Compiláveis


💻 Exemplo 1 — Entidade Declarativa com Índices e Constraints

from typing import Optional
from datetime import datetime
from sqlmodel import SQLModel, Field

class Produto(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    sku: str = Field(unique=True, index=True, max_length=20)
    nome: str = Field(index=True, max_length=120)
    preco_centavos: int = Field(gt=0, description="Preço em centavos, evita ponto flutuante")
    estoque: int = Field(default=0, ge=0)
    criado_em: datetime = Field(default_factory=datetime.utcnow)

produto = Produto(sku="MSE-GMR-01", nome="Mouse Gamer 16000DPI", preco_centavos=15000)
print(produto.model_dump())

💻 Exemplo 2 — Separação de Schemas (Base / Create / Read / Table)

from typing import Optional
from sqlmodel import SQLModel, Field

class ClienteBase(SQLModel):
    nome: str
    email: str

class ClienteCreate(ClienteBase):
    senha_plana: str

class ClienteRead(ClienteBase):
    id: int
    ativo: bool

class ClienteDB(ClienteBase, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    senha_hash: str
    ativo: bool = True

def registrar_cliente(payload: ClienteCreate) -> ClienteRead:
    senha_hash = f"hash::{payload.senha_plana[::-1]}"  # placeholder de hashing real (ver Cap. 09)
    cliente_db = ClienteDB(nome=payload.nome, email=payload.email, senha_hash=senha_hash)
    cliente_db.id = 1  # simula ID atribuído pelo banco após o INSERT
    return ClienteRead.model_validate(cliente_db)

entrada = ClienteCreate(nome="Bruno Lima", email="bruno@empresa.com", senha_plana="s3nh4segura")
saida = registrar_cliente(entrada)
print(saida.model_dump())  # nunca inclui senha_hash

💻 Exemplo 3 — Engine com Pool de Conexões e Criação de Schema

from sqlmodel import SQLModel, Field, create_engine, Session
from typing import Optional

class Categoria(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    nome: str = Field(unique=True)

engine = create_engine(
    "sqlite:///:memory:",
    echo=False,
    pool_pre_ping=True,
)

def inicializar_schema() -> None:
    SQLModel.metadata.create_all(engine)

def semear_categorias() -> None:
    with Session(engine) as session:
        session.add_all([Categoria(nome="Eletrônicos"), Categoria(nome="Livros")])
        session.commit()

inicializar_schema()
semear_categorias()
print(f"Tabelas registradas: {list(SQLModel.metadata.tables.keys())}")