ORM leve com introspecção automática para bancos JDBC como Informix, usando integração com wbjdbc.
Project description
WBORM 🚀
Enterprise-Ready ORM para Python com Performance de Alto Nível
WBORM é uma biblioteca ORM profissional para Python, projetada para trabalhar com bancos de dados legados via JDBC (Informix, DB2, Oracle, entre outros). Com foco em performance, escalabilidade e produtividade, oferece recursos avançados de caching, lazy loading, paginação eficiente e monitoramento automático.
✨ Destaques v0.4.0
🎯 Performance & Escalabilidade
- Cache Configurável: 3 backends (Memory, LRU, Disk) com TTL customizável
- Lazy Loading:
.only()e.defer()para otimizar queries - Paginação Eficiente: Page-based e cursor-based para milhões de registros
- Monitoramento Automático: Track de todas as queries com métricas detalhadas
- Otimização de Queries: Análise automática de JOIN/GROUP BY/PIVOT
💎 Core Features
- Conexão direta via JDBC usando
wbjdbc - Geração automática de modelos com introspecção
- API fluente:
.select(),.filter(),.join(),.group_by(),.order_by() - JOINs avançados:
LEFT ANTI,RIGHT ANTI - Pivot dinâmico:
.pivot() - Tabelas temporárias:
.create_temp_table() - Visualização terminal com cores e paginação
- Operações CRUD com segurança
- Integração Pandas e Spark
- Autocomplete com stubs
.pyi - Expressões SQL:
col(),now(),date(),raw()
📁 Instalação
pip install wborm wbjdbc
Para uso real com wbjdbc 2.0, prefira Python 3.12 ou 3.13. Neste momento, ambientes apenas com Python 3.14 podem falhar na instalação do JPype1, que é dependência do wbjdbc.
🚀 Quick Start
Conexão e Modelos
from wbjdbc import connect_optimized
from wborm import register_global_connection, generate_model
conn = connect_optimized(
db_type="informix-sqli",
host="localhost",
port=9088,
database="stores_demo",
user="informix",
password="in4mix",
server="informix"
)
register_global_connection(conn)
# Gerar modelo
Cliente = generate_model("customer")
Consultas Básicas
# Query simples
clientes = Cliente.filter(status="ATIVO").all()
# Com ordenação e limite
clientes = (
Cliente
.filter(idade__gt=18)
.order_by("nome")
.limit(10)
.all()
)
# Exibir resultados
Cliente.filter(cidade="São Paulo").show()
Sessão, transação e Unit of Work
session = Cliente.session()
with session.transaction():
cliente = session.query(Cliente).filter(id=101).first()
cliente.nome = "Novo nome"
Eager loading, locking e bulk operations
# Eager loading básico
clientes = Cliente.preload("orders").limit(20).all()
# Pessimistic locking
cliente = Cliente.filter(id=101).lock_for_update().first()
# Bulk operations com execute_batch() do wbjdbc quando disponível
Cliente.bulk_add([Cliente(id=1, nome="A"), Cliente(id=2, nome="B")], confirm=True)
Cliente.bulk_delete([1, 2], confirm=True)
Migrações
from wborm import CreateTableMigration, Migrator
from wborm.core import Model
from wborm.fields import Field
class CustomerNote(Model):
__tablename__ = "customer_notes"
id = Field(int, primary_key=True)
customer_id = Field(int, nullable=False)
note = Field(str, max_length=255)
migrator = Migrator(conn)
migrations = [
CreateTableMigration.from_model("001", CustomerNote)
]
migrator.apply(migrations)
FastAPI
Instalação opcional:
pip install "wborm[api]"
Integração por request:
from fastapi import Depends, FastAPI
from wborm import create_session_dependency
app = FastAPI()
get_session = create_session_dependency(conn)
@app.get("/customers/{customer_id}")
def get_customer(customer_id: int, session=Depends(get_session)):
customer = session.query(Customer).filter(customer_num=customer_id).first()
return customer.to_dict() if customer else {"detail": "not found"}
Também há helpers prontos para API:
create_read_schema(...)ecreate_write_schema(...)para Pydanticregister_exception_handlers(app)para mapear erros do ORM em HTTPapply_api_filters(...)para whitelisting de filtrospaginate_query(...)para resposta paginada padrão
🎯 Performance Features (Epic 2)
1. Cache Configurável
from wborm import configure_cache, LRUCacheBackend
# Configurar cache global
configure_cache(
ttl=300, # 5 minutos
backend=LRUCacheBackend(max_size=100)
)
# Cache por query
clientes = Cliente.filter(tipo="VIP").cache(ttl=600).all()
# Bypass cache (força query ao vivo)
saldo = Conta.filter(id=123).live().first()
# Estatísticas
from wborm import cache_stats
stats = cache_stats()
print(f"Hit rate: {stats['hit_rate']:.1%}")
Backends disponíveis:
MemoryCacheBackend: Dict simples, rápidoLRUCacheBackend: Evicção LRU inteligenteDiskCacheBackend: Persistente em disco
2. Lazy Loading
# Carregar apenas colunas necessárias
produtos = Produto.only("id", "nome", "preco").all()
# Reduz 50-70% de dados com BLOBs!
# Adiar colunas pesadas
produtos = Produto.defer("imagem_blob", "descricao_completa").all()
# Batch loading (evita N+1)
from wborm import batch_load_fields
batch_load_fields(produtos, ["descricao", "categoria"])
Também há eager loading via .preload(...) para relações registradas.
3. Paginação Eficiente
# Paginação simples
page = Cliente.filter(ativo=True).paginate(page=2, page_size=50)
print(f"Página {page.page} de {page.pages}")
for cliente in page.items:
print(cliente.nome)
# Cursor pagination (para milhões de registros)
from wborm import cursor_paginate
page1 = cursor_paginate(Cliente.all(), page_size=1000)
page2 = cursor_paginate(Cliente.all(), cursor=page1['next_cursor'])
# Performance O(1) constante!
4. Monitoramento Automático
from wborm import configure_monitoring, print_performance_report
# Configurar threshold de 0.5s
configure_monitoring(slow_query_threshold=0.5)
# Executar queries...
Cliente.all()
Pedido.filter(status="PENDENTE").all()
# Ver relatório
print_performance_report()
Output:
============================================================
WBORM Performance Report
============================================================
Total Queries: 245
Slow Queries: 12 (4.9%)
Average Duration: 0.145s
Cache Hit Rate: 73.5%
Top 5 Slowest Queries:
------------------------------------------------------------
1. 1.234s (1,500 rows)
SELECT * FROM orders WHERE...
5. Otimização de Queries
from wborm import analyze_query, register_table_stats
# Registrar tamanhos de tabelas
register_table_stats("clientes", 50000)
register_table_stats("pedidos", 1000000)
# Analisar query
sql = "SELECT * FROM clientes JOIN pedidos JOIN items"
analysis = analyze_query(sql)
print(analysis['complexity_score']) # 8
print(analysis['suggestions'])
# ["Multiple JOINs detected - ensure JOIN columns are indexed"]
# Agregações otimizadas
from wborm import Count, Sum, Avg, aggregate_with_cache
results = aggregate_with_cache(
Pedido.filter(status="COMPLETO"),
total=Count(),
valor_total=Sum("valor"),
valor_medio=Avg("valor")
)
# Cached automaticamente por 5 minutos!
📊 JOINs e Agregações
JOINs
# INNER JOIN
resultado = (
Cliente
.join(Pedido, "cliente_id")
.filter(t1(status="ATIVO"))
.show()
)
# LEFT JOIN
resultado = Cliente.join(Pedido, "cliente_id", "left").all()
# ANTI JOIN (clientes sem pedidos)
sem_pedidos = Cliente.join(Pedido, "cliente_id", "left_anti").all()
Relacionamentos
# Relações 1:1 / 1:N podem ser inferidas das FKs pela introspecção
pedidos = Cliente.preload("orders").first().orders
# N:N explícito via tabela associativa
Usuario.many_to_many("roles", Role, through="usuario_role", local_key="usuario_id", remote_key="role_id")
roles = Usuario.filter(id=10).first().roles
Agregações
# COUNT
total = Cliente.count()
# Agregações múltiplas
from wborm import Count, Sum, Avg
stats = aggregate_with_cache(
Pedido.all(),
total_pedidos=Count(),
valor_total=Sum("valor"),
ticket_medio=Avg("valor")
)
PIVOT
# Pivot dinâmico
vendas.pivot(
index="categoria",
columns="mes",
values=["quantidade", "valor"]
)
🔧 Desenvolvimento
Configuração
# Instalar dependências
pip install -e ".[dev]"
# Formatar código
make format
# Rodar testes
make test
# Verificar tipos
make type-check
# Tudo de uma vez
make check
Tooling
- black: Formatação de código
- isort: Organização de imports
- flake8: Linting
- mypy: Type checking
- pytest: Testes
📚 Documentação Completa
🎯 Roadmap
✅ Core Refactoring (100%)
- Módulos utilitários extraídos
- Código morto removido
- Type hints completos
- Suite de testes
- CI/CD completo
✅ Performance & Escalabilidade (100%)
- Cache configurável com múltiplos backends
- Lazy loading de colunas
- Paginação eficiente (offset + cursor)
- Monitoramento automático de queries
- Otimização de JOIN/GROUP BY/PIVOT
🔜 Multi-Database Support
- Suporte DB2
- Suporte Oracle
- Type mapping específico por banco
- Documentação de diferenças
🔜 Fluent API Enhancements
- Query builders avançados
- Subquery support melhorado
- Sessões e locking mais avançados
📌 Estado atual do ORM
Hoje o wborm já cobre:
- mapeamento objeto <-> tabela e coluna ↔ atributo
- suporte a tipos, validação, hooks e serialização
- CRUD, SQL nativo, query builder, joins, paginação e cache
- relacionamentos 1:1, 1:N e N:N explícito
- lazy loading parcial, eager loading básico, sessão/transação
- identity map, unit of work básico, optimistic/pessimistic locking
- bulk insert/update/delete e migrações simples versionadas
O que continua propositalmente simples:
- migrações ainda são SQL-first, não um DSL completo
- eager loading e N:N cobrem o caso prático, não uma engine relacional genérica ao nível de SQLAlchemy/Django ORM
📈 Performance Benchmarks
| Feature | Antes | Depois | Ganho |
|---|---|---|---|
| Cache hit rate | - | 85%+ | - |
| Data transfer (com BLOBs) | 100% | 30-50% | 50-70% |
| Pagination (1M+ records) | O(n) | O(1) | Constante |
| Slow query detection | Manual | Automático | 100% |
🤝 Contribuindo
Contribuições são bem-vindas! Veja CONTRIBUTING.md para guidelines.
# Fork o projeto
# Crie uma branch
git checkout -b feature/nova-feature
# Commit suas mudanças
git commit -m "feat: adiciona nova feature"
# Push para a branch
git push origin feature/nova-feature
# Abra um Pull Request
📄 Licença
MIT License - veja LICENSE para detalhes.
🙏 Agradecimentos
- Comunidade Python
- Colaboradores do projeto
- Usuários e early adopters
📞 Suporte
- Issues: GitHub Issues
- Documentação: Docs
- Email: [wanderbatistaf@gmail.com]
WBORM - Production-ready ORM com performance enterprise-level! 🚀
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wborm-0.4.0.tar.gz.
File metadata
- Download URL: wborm-0.4.0.tar.gz
- Upload date:
- Size: 98.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
42fb754f876328cde1837a6c9602e109d1466c12eb6c66aef6e3317ed2c2cef8
|
|
| MD5 |
1849f5db1fdcd939dfc2def293aaa826
|
|
| BLAKE2b-256 |
f43ec2d5622b8dea30a166ab2bfab746de9175d6e8abb6934512bf29fef813d4
|
Provenance
The following attestation bundles were made for wborm-0.4.0.tar.gz:
Publisher:
publish-package.yml on wanderbatistaf/wborm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wborm-0.4.0.tar.gz -
Subject digest:
42fb754f876328cde1837a6c9602e109d1466c12eb6c66aef6e3317ed2c2cef8 - Sigstore transparency entry: 1361764196
- Sigstore integration time:
-
Permalink:
wanderbatistaf/wborm@9861b7826677be631ca94c0a9c90428bec7fa6a8 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/wanderbatistaf
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@9861b7826677be631ca94c0a9c90428bec7fa6a8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file wborm-0.4.0-py3-none-any.whl.
File metadata
- Download URL: wborm-0.4.0-py3-none-any.whl
- Upload date:
- Size: 108.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32bac8cbde138a5e078ad76609f51be94c05dec58166e15aaca009d7308dab8a
|
|
| MD5 |
4e8cab71ce383aba4cae9ab89bf523a6
|
|
| BLAKE2b-256 |
8bb4b24e0befd1845c24ae5fd17b25a9d54d7f9e8848cf725710071ebcb57df5
|
Provenance
The following attestation bundles were made for wborm-0.4.0-py3-none-any.whl:
Publisher:
publish-package.yml on wanderbatistaf/wborm
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wborm-0.4.0-py3-none-any.whl -
Subject digest:
32bac8cbde138a5e078ad76609f51be94c05dec58166e15aaca009d7308dab8a - Sigstore transparency entry: 1361764211
- Sigstore integration time:
-
Permalink:
wanderbatistaf/wborm@9861b7826677be631ca94c0a9c90428bec7fa6a8 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/wanderbatistaf
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@9861b7826677be631ca94c0a9c90428bec7fa6a8 -
Trigger Event:
push
-
Statement type: