Introdução
SQLAlchemy e Pydantic são duas ferramentas poderosas no ecossistema Python: uma para trabalhar com bancos de dados e a outra para validação de dados. No entanto, sempre existiu uma lacuna entre elas. A solução para esse problema é o SQLModel – uma ORM baseada em Pydantic que une o melhor dos dois mundos.
O SQLModel permite usar modelos tipados do Pydantic como tabelas ORM do SQLAlchemy. Isso simplifica o desenvolvimento, acelera a criação de APIs e elimina a duplicação de código entre modelos de banco de dados e serializadores.
O que é SQLModel e por que usá-lo
SQLModel é uma biblioteca ORM moderna para Python, criada por Sebastián Ramírez (criador do FastAPI) em 2021. Ela resolve um dos maiores problemas do desenvolvimento web: a duplicação de código entre modelos de banco de dados e esquemas de validação de dados.
Principais vantagens do SQLModel
O SQLModel oferece aos desenvolvedores uma interface unificada para trabalhar com bancos de dados e validação de dados. As principais vantagens incluem:
- Modelo de dados único: um único modelo para banco de dados e API
- Validação automática: validação de dados integrada do Pydantic
- Tipagem: suporte completo a tipos Python e IDEs
- Compatibilidade: funciona com projetos SQLAlchemy existentes
- Assincronicidade: suporte nativo a async/await
Instalação e configuração
Instalação básica
pip install sqlmodel
Instalação com dependências adicionais
Para trabalhar com PostgreSQL:
pip install sqlmodel[postgresql]
Para operações assíncronas:
pip install sqlmodel[async]
Instalação completa com todas as dependências:
pip install "sqlmodel[postgresql,async]"
Conexão ao banco de dados
from sqlmodel import SQLModel, create_engine
# SQLite (para desenvolvimento)
engine = create_engine("sqlite:///database.db")
# PostgreSQL
engine = create_engine("postgresql://usuario:senha@localhost/nome_banco")
# MySQL
engine = create_engine("mysql+pymysql://usuario:senha@localhost/nome_banco")
Fundamentos do SQLModel
Criando um modelo básico
from sqlmodel import SQLModel, Field
from typing import Optional
class Usuario(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
nome: str = Field(index=True)
email: str = Field(unique=True)
idade: int = Field(ge=0, le=150)
ativo: bool = Field(default=True)
Parâmetros do Field
O SQLModel usa o Field estendido do Pydantic com recursos adicionais:
class Produto(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
nome: str = Field(max_length=100, index=True)
preco: float = Field(gt=0, description="Preço do produto")
categoria_id: int = Field(foreign_key="categoria.id")
criado_em: datetime = Field(default_factory=datetime.now)
Criando tabelas no banco de dados
from sqlmodel import SQLModel, create_engine
engine = create_engine("sqlite:///database.db")
# Criar todas as tabelas
SQLModel.metadata.create_all(engine)
# Criar uma tabela específica
Usuario.metadata.create_all(engine)
Operações CRUD com SQLModel
Criando registros
from sqlmodel import Session
# Criar um único registro
usuario = Usuario(nome="João", email="joao@exemplo.com", idade=30)
with Session(engine) as session:
session.add(usuario)
session.commit()
session.refresh(usuario) # Obter o ID do banco
print(f"Usuário criado com ID: {usuario.id}")
Também na biblioteca
Biblioteca GraphQL JavaScript (Node.js): Guia Completo sobre Apollo Server e Ferramentas
Bibliotecas WebSocket Rust: Tokio-tungstenite e async-tungstenite para tempo real
TipKit para Swift: Guia completo com exemplos práticos
Cache em Go (Golang): Redis, in-memory e outras soluções
Validação de dados em Kotlin: bibliotecas, abordagens e exemplos de código