Recentemente apresentado no PyCon US 2013, o Pony ORM é uma biblioteca de Mapeamento Objeto-Relacional (ou ORM, do inglês Object-Relational Mapping) implementada em Python. Atualmente desenvolvido por Alexander Kozlovsky e Alexey Malashkevich, a principal característica do Pony ORM é a geração de consultas SQL em Python puro, por meio de Expressões Geradoras.
O Pony ORM tem funcionalidades similares ao ORM do Django e ao SQLAlchemy, outras ferramentas em Python mais conhecidas. Assim como o Django, o Pony fornece:
- Suporte ao padrão Identity Map;
- Gerenciamento automático de transações;
- Transações otimistas;
- Caching automático de consultas e objetos;
- Suporte completo a chaves compostas.
E procura oferecer vantagens em relação aos concorrentes:
- Sintaxe mais simples para escrever consultas;
- Otimização automática de consultas;
- Solução elegante para o problema de Select N+1;
- Editor gráfico de diagramas de banco de dados que gera automaticamente o código Python do modelo.
O Pony ORM foi concebido especialmente para o desenvolvimento de aplicações web. Um caso em que funciona bem é na geração de páginas web dinâmicas, quando frequentemente milhares de objetos são extraídos do banco de dados de uma só vez. No entanto, existem algumas restrições para seu uso. Segundo seus criadores:
o Pony ORM não é adequado em casos que requerem o processamento simultâneo de milhões ou mesmo centenas de milhares de registros de um banco de dados. Para esses casos, são mais indicados o uso de SQL puro ou do ORM SQLAlchemy.
O projeto também é capaz de chamar stored procedures ou montar consultas em dialetos específicos de banco de dados. Os bancos suportados são SQLite, MySQL, PostgreSQL e Oracle.
Iniciado em 2006 como projeto open source, o Pony ORM é disponibilizado sob a licença GNU Affero General Public 3.0. Seu uso é livre para fins não-comerciais, mas há custo de licenciamento para uso em projetos comerciais.
Para testar o Pony, é possível instalá-lo através do PyPi do Python - digitando "pip install pony" no prompt de comando - ou baixando seus fontes do GitHub.