Peewee - Um ORM Python minimalista
Peewee é um ORM destinado a criar e gerenciar tabelas de banco de dados relacionais através de objetos Python. Segundo a wikipedia, um ORM é:
Mapeamento objeto-relacional (ou ORM, do inglês: Object-relational mapping) é uma técnica de desenvolvimento > utilizada para reduzir a impedância da programação orientada aos objetos utilizando bancos de dados relacionais. As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.
O que um ORM faz é, basicamente, transformar classes Python em tabelas no banco de dados, além de permitir construir querys usando diretamente objetos Python ao invés de SQL.
O Peewee é destinado a projetos de pequeno/médio porte e se destaca pela simplicidade quando comparado a outros ORM mais conhecidos, como o SQLAlchemy. Uma analogia utilizada pelo autor da API e que acho muito interessante é que Peewee está para o SQLAlchemy assim como SQLite está para o PostgreSQL.
Em relação aos recursos por ele oferecidos, podemos citar que ele possui suporte nativo a SQLite, PostgreSQL e MySQL, embora seja necessário a instalação de drivers para utilizá-lo com PostgreSQL e MySQL e suporta tanto Python 2.6+ quanto Python 3.4+.
Neste tutorial, utilizaremos o SQLite, por sua simplicidade de uso e pelo Python possuir suporte nativo ao mesmo (usaremos o Python 3.5).
Instalação
O Peewee pode ser facilmente instalado com o gerenciador de pacotes pip (recomendo a instalação em um virtualenv):
1 | pip install peewee |
Criando o banco de dados
Para criar o banco de dados é bem simples. Inicialmente passamos o nome do nosso banco de dados (a extensão *.db
indica um arquivo do SQLite).
1 | import peewee |
Diferente de outros bancos de dados que funcionam através um servidor, o SQLite cria um arquivo de extensão *.db
, onde todos os nossos dados são armazenados.
Caso deseje ver as tabelas existentes no arquivo
codigo_avulso.db
, instale o aplicativoSQLiteBrowser
. Com ele fica fácil monitorar as tabelas criadas e acompanhar o tutorial.
1 | sudo apt-get install sqlitebrowser |
A título de exemplo, vamos criar um banco destinado a armazenar nomes de livros e de seus respectivos autores. Iremos chamá-lo de models.py
.
Inicialmente, vamos criar a classe base para todos os nossos models
. Esta é uma abordagem recomendada pela documentação e é considerada uma boa prática. Também adicionaremos um log para acompanharmos as mudanças que são feitas no banco:
1 | # models.py |
A class BaseModel
é responsável por criar a conexão com nosso banco de dados.
Agora, vamos criar a model que representa os autores:
1 | # models.py |
Se observamos a model Author
, veremos que não foi especificado nenhuma coluna como primary key (chave primaria), sendo assim o Peewee irá criar um campo chamado id
do tipo inteiro com auto incremento para funcionar como chave primária.
Em seguida, no mesmo arquivo models.py
criamos a classe que representa os livros. Ela possui uma relação de “muitos para um” com a tabela de autores, ou seja, cada livro possui apenas um autor, mas um autor pode possuir vários livros.
1 | # models.py |
Agora, adicionamos o código que cria as tabelas Author
e Book
.
1 | # models.py |
excerpt
Agora executamos o models.py
:
1 | python models.py |
A estrutura do diretório ficou assim:
1 | . |
Após executarmos o código, será criado um arquivo de nome codigo_avulso.db
no mesmo diretório do nosso arquivo models.py
, contendo as tabelas Author
e Book
.
Realizando o CRUD
Agora vamos seguir com as 4 principais operações que podemos realizar em um banco de dados, também conhecida como CRUD.
A sigla CRUD
é comumente utilizada para designar as quatro operações básicas que pode-se executar em um banco de dados, sendo elas:
- Create (criar um novo registro no banco)
- Read (ler/consultar um registro)
- Update (atualizar um registro)
- Delete (excluir um registro do banco)
Iremos abordar cada uma dessas operações.
Create: Inserindo dados no banco
Agora, vamos popular nosso banco com alguns autores e seus respectivos livros. Para isso criamos um arquivo create.py
. A estrutura do diretório ficou assim:
1 | . |
A criação dos registros no banco pode ser feito através do método create
, quando desejamos inserir um registro apenas; ou pelo método insert_many
, quando desejamos inserir vários registros de uma vez em uma mesma tabela.
1 | # create.py |
Read: Consultando dados no banco
O Peewee possui comandos destinados a realizar consultas no banco. De maneira semelhante ao conhecido SELECT
. Podemos fazer essa consulta de duas maneiras. Se desejamos o primeiro registro que corresponda a nossa pesquisa, podemos utilizar o método get()
.
1 | # read.py |
Porém, se desejamos mais de um registro, utilizamos o método select
. Por exemplo, para consultar todos os livros escritos pelo autor “H. G. Wells”.
1 | # read.py |
Também podemos utilizar outras comandos do SQL como limit
e group
(para mais detalhes, ver a documentação aqui).
A estrutura do diretório ficou assim:
1 | . |
Update: Alterando dados no banco
Alterar dados também é bem simples. No exemplo anterior, se observarmos o resultado da consulta dos livros do autor “H. G. Wells”, iremos nos deparar com o livro de título “Vinte Mil Léguas Submarinas”. Se você, caro leitor, gosta de contos de ficção-científica, sabe que esta obra foi escrito por “Julio Verne”, coincidentemente um dos autores que também estão cadastrados em nosso banco. Sendo assim, vamos corrigir o autor do respectivo livro.
Primeiro vamos buscar o registro do autor e do livro:
1 | # update.py |
Agora vamos alterar o autor e gravar essa alteração no banco.
1 | # update.py |
A estrutura do diretório ficou assim:
1 | . |
Delete: Deletando dados do banco
Assim como as operações anteriores, também podemos deletar registros do banco de maneira bem prática. Como exemplo, vamos deletar o livro “Guerra dos Mundos” do nosso banco de dados.
1 | # delete.py |
Simples não?
A estrutura do diretório ficou assim:
1 | . |
Conclusão
É isso pessoal. Este tutorial foi uma introdução bem enxuta sobre o Peewee. Ainda existem muitos tópicos que não abordei aqui, como a criação de primary_key, de campos many2many entre outros recursos, pois foge do escopo deste tutorial. Se você gostou do ORM, aconselho a dar uma olhada também na sua documentação, para conseguir extrair todo o potencial da ferramenta. A utilização de um ORM evita que o desenvolvedor perca tempo escrevendo query SQL e foque totalmente no desenvolvimento de código.