💻 Exemplos: Capítulo 05: Mapeamento ORM com SQLModel e Modelos Declarativos
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())}")