Skip to content

Commit e26ddb5

Browse files
committed
Atualiza 'peewee-um-orm-python-minimalista.md'
1 parent 4b3dfe9 commit e26ddb5

File tree

1 file changed

+159
-66
lines changed

1 file changed

+159
-66
lines changed

content/peewee-um-orm-python-minimalista.md

Lines changed: 159 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -11,147 +11,189 @@ Site: https://mstuttgart.github.io/
1111
Summary: Conheça o Peewee, um prático e minimalista ORM Python
1212

1313
[Peewee](http://peewee.readthedocs.io/en/latest/index.html) é um ORM destinado a criar e gerenciar tabelas de banco de dados relacionais através de objetos Python. Segundo a [wikipedia](https://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional), um ORM é:
14-
>>> 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.
1514

16-
O que o 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.
15+
> 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.
1716
18-
O Peewee é destinado a projetos de pequeno/médio porte, se destacando 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.
17+
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.
1918

20-
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+.
19+
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.
2120

22-
Neste tutorial, utilizaremos o SQLite, por sua simplicidade de uso e por não precisar de nenhuma configuração.
21+
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+.
2322

24-
### Instalação
23+
Neste tutorial, utilizaremos o SQLite, por sua simplicidade de uso e pelo Python possuir suporte nativo ao mesmo (usaremos o Python 3.5).
2524

26-
O Peewee pode ser facilmente instalado com o gerenciador de pacotes *pip*:
25+
## Instalação
2726

28-
```bash
27+
O Peewee pode ser facilmente instalado com o gerenciador de pacotes *pip* (recomendo a instalação em um virtualenv):
28+
29+
```
2930
pip install peewee
3031
```
3132

32-
### Criando o banco de dados
33+
## Criando o banco de dados
3334

34-
Para criar as tabelas é bem simples. Inicialmente passamos o nome do nosso banco de dados (a extensão `*.db` indica um arquivo do SQLite).
35+
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).
3536

3637
```python
3738
import peewee
3839

40+
# Aqui criamos o banco de dados
3941
db = peewee.SqliteDatabase('codigo_avulso.db')
4042

4143
```
4244

4345
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.
4446

45-
**DICA**: caso deseje ver as tabelas existentes no arquivo `codigo_avulso.db`, instale o aplicativo `SQLiteBrowser`. Com ele fica fácil monitorar as tabelas criadas e acompanhar o tutorial.
46-
47-
```bash
47+
> Caso deseje ver as tabelas existentes no arquivo `codigo_avulso.db`, instale o aplicativo `SQLiteBrowser`. Com ele fica fácil monitorar as tabelas criadas e acompanhar o tutorial.
48+
```shell
4849
sudo apt-get install sqlitebrowser
4950
```
5051

51-
A título de exemplo, vamos criar um banco destinado a armazenar nomes de livros e de seus respectivos autores. Comecemos primeiro com a classe que representa os autores.
52+
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`.
53+
54+
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:
5255

5356
```python
57+
# models.py
58+
5459
import peewee
5560

61+
# Criamos o banco de dados
5662
db = peewee.SqliteDatabase('codigo_avulso.db')
5763

58-
class Author(peewee.Model):
59-
"""
60-
Classe que representa a tabela Author
61-
"""
6264

63-
# A tabela possui apenas o campo 'name', que
64-
# receberá o nome do autor
65-
name = peewee.CharField()
65+
class BaseModel(peewee.Model):
66+
"""Classe model base"""
6667

6768
class Meta:
6869
# Indica em qual banco de dados a tabela
6970
# 'author' sera criada (obrigatorio). Neste caso,
70-
# utilizamos o banco 'codigo_avulso.db' criado anteriormente.
71+
# utilizamos o banco 'codigo_avulso.db' criado anteriormente
7172
database = db
7273

7374
```
74-
Em seguida, 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.
75+
76+
A class `BaseModel` é responsável por criar a conexão com nosso banco de dados.
77+
78+
Agora, vamos criar a model que representa os autores:
7579

7680
```python
77-
import peewee
81+
# models.py
7882

79-
db = peewee.SqliteDatabase('codigo_avulso.db')
83+
class Author(BaseModel):
8084

81-
class Book(peewee.Model):
85+
"""
86+
Classe que representa a tabela Author
87+
"""
88+
# A tabela possui apenas o campo 'name', que receberá o nome do autor sera unico
89+
name = peewee.CharField(unique=True)
90+
91+
```
92+
93+
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.
94+
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.
95+
96+
```python
97+
# models.py
98+
99+
class Book(BaseModel):
82100
"""
83101
Classe que representa a tabela Book
84102
"""
85103

86-
# A tabela possui apenas o campo 'title', que
87-
# receberá o nome do livro
88-
title = peewee.CharField()
104+
# A tabela possui apenas o campo 'title', que receberá o nome do livro
105+
title = peewee.CharField(unique=True)
89106

90107
# Chave estrangeira para a tabela Author
91108
author = peewee.ForeignKeyField(Author)
92109

93-
class Meta:
94-
# Indica em qual banco de dados a tabela
95-
# 'author' sera criada (obrigatorio). Neste caso,
96-
# utilizamos o banco 'codigo_avulso.db' criado anteriormente.
97-
database = db
98110
```
99111

100-
Agora, vamos reunir tudo em um único arquivo `model.py`. Como exemplo, eu criei um arquivo *main.py* para utilizarmos as classes que acabamos de criar.
112+
Agora, adicionamos o código que cria as tabelas `Author` e `Book`.
101113

102114
```python
103-
104-
import peewee
105-
from model import Author, Book
106-
115+
# models.py
107116

108117
if __name__ == '__main__':
109118
try:
110119
Author.create_table()
120+
print("Tabela 'Author' criada com sucesso!")
111121
except peewee.OperationalError:
112-
print 'Tabela Author ja existe!'
122+
print("Tabela 'Author' ja existe!")
113123

114124
try:
115125
Book.create_table()
126+
print("Tabela 'Book' criada com sucesso!")
116127
except peewee.OperationalError:
117-
print 'Tabela Book ja existe!'
128+
print("Tabela 'Book' ja existe!")
129+
```
130+
excerpt
131+
Agora executamos o `models.py`:
118132

133+
```
134+
python models.py
119135
```
120136

121-
Após executarmos o código, será criado um arquivo de nome `codigo_avulso.db` no mesmo diretório do nosso arquivo `main.py`, contendo as tabelas `Author` e `Book`. A estrutura do diretório ficou assim:
137+
A estrutura do diretório ficou assim:
122138

123-
```bash
139+
```shell
124140
.
125141
├── codigo_avulso.db
126-
├── main.py
127-
├── model.py
142+
├── models.py
128143
```
129144

130-
### Inserindo dados no banco
145+
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`.
131146

132-
Agora, vamos popular nosso banco com alguns autores e seus respectivos livros. Isso pode ser feito de dois modos. 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.
147+
## Realizando o CRUD
148+
149+
Agora vamos seguir com as 4 principais operações que podemos realizar em um banco de dados, também conhecida como CRUD.
150+
151+
A sigla `CRUD` é comumente utilizada para designar as quatro operações básicas que pode-se executar em um banco de dados, sendo elas:
152+
153+
- Create (criar um novo registro no banco)
154+
- Read (ler/consultar um registro)
155+
- Update (atualizar um registro)
156+
- Delete (excluir um registro do banco)
157+
158+
Iremos abordar cada uma dessas operações.
159+
160+
### Create: Inserindo dados no banco
161+
162+
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:
163+
164+
```shell
165+
.
166+
├── codigo_avulso.db
167+
├── models.py
168+
├── create.py
169+
```
170+
171+
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.
133172

134173
```python
174+
# create.py
175+
176+
from models import Author, Book
135177

136178
# Inserimos um autor de nome "H. G. Wells" na tabela 'Author'
137179
author_1 = Author.create(name='H. G. Wells')
138180

181+
# Inserimos um autor de nome "Julio Verne" na tabela 'Author'
182+
author_2 = Author.create(name='Julio Verne')
183+
139184
book_1 = {
140185
'title': 'A Máquina do Tempo',
141-
'author': author_1,
186+
'author_id': author_1,
142187
}
143188

144189
book_2 = {
145190
'title': 'Guerra dos Mundos',
146-
'author': author_1,
191+
'author_id': author_1,
147192
}
148193

149-
# Inserimos um autor de nome "Julio Verne" na tabela 'Author'
150-
author_2 = Author.create(name='Julio Verne')
151-
152194
book_3 = {
153195
'title': 'Volta ao Mundo em 80 Dias',
154-
'author': author_2,
196+
'author_id': author_2,
155197
}
156198

157199
book_4 = {
@@ -166,24 +208,34 @@ Book.insert_many(books).execute()
166208

167209
```
168210

169-
### Consultando dados no banco
211+
### Read: Consultando dados no banco
170212

171213
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()`.
172214

173215
```python
216+
# read.py
217+
218+
from models import Author, Book
219+
174220
book = Book.get(Book.title == "Volta ao Mundo em 80 Dias").get()
175-
book.title
221+
print(book.title)
222+
223+
# Resultado
224+
# * Volta ao Munto em 80 Dias
176225
```
226+
177227
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".
178228

179229
```python
230+
# read.py
231+
180232
books = Book.select().join(Author).where(Author.name=='H. G. Wells')
181233

182234
# Exibe a quantidade de registros que corresponde a nossa pesquisa
183-
print books.count()
235+
print(books.count())
184236

185237
for book in books:
186-
book.title
238+
print(book.title)
187239

188240
# Resultado:
189241
# * A Máquina do Tempo
@@ -194,51 +246,92 @@ for book in books:
194246

195247
Também podemos utilizar outras comandos do SQL como `limit` e `group` (para mais detalhes, ver a documentação [aqui](http://peewee.readthedocs.io/en/latest/index.html)).
196248

197-
### Alterando dados no banco
249+
A estrutura do diretório ficou assim:
250+
251+
```sh
252+
.
253+
├── codigo_avulso.db
254+
├── models.py
255+
├── create.py
256+
├── read.py
257+
```
258+
259+
### Update: Alterando dados no banco
198260

199261
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.
200262

201263
Primeiro vamos buscar o registro do autor e do livro:
202264

203265
```python
266+
# update.py
267+
268+
from models import Author, Book
269+
204270
new_author = Author.get(Author.name == 'Julio Verne')
205271
book = Book.get(Book.title=="Vinte Mil Leguas Submarinas")
206272
```
273+
207274
Agora vamos alterar o autor e gravar essa alteração no banco.
208275

209276
```python
277+
# update.py
278+
210279
# Alteramos o autor do livro
211280
book.author = new_author
212281

213282
# Salvamos a alteração no banco
214283
book.save()
215284
```
216285

217-
### Deletando dados do banco
286+
A estrutura do diretório ficou assim:
287+
288+
```sh
289+
.
290+
├── codigo_avulso.db
291+
├── models.py
292+
├── create.py
293+
├── read.py
294+
├── update.py
295+
```
296+
297+
### Delete: Deletando dados do banco
218298

219299
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.
220300

221301
```python
302+
# delete.py
303+
304+
from models import Author, Book
305+
222306
# Buscamos o livro que desejamos excluir do banco
223307
book = Book.get(Book.title=="Guerra dos Mundos")
224308

225309
# Excluimos o livro do banco
226310
book.delete_instance()
311+
227312
```
313+
228314
Simples não?
229315

230-
### Conclusão
316+
A estrutura do diretório ficou assim:
231317

232-
É 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 desenolvimento de código.
318+
```sh
319+
.
320+
├── codigo_avulso.db
321+
├── models.py
322+
├── create.py
323+
├── read.py
324+
├── update.py
325+
├── delete.py
326+
```
233327

234-
O Peewee também possui suporte ao flamework *flask*, então dependendo do tamanho do projeto, pode ser uma alternativa interessante no lugar de ORM mais complexos como o SQLAlchemy.
328+
## Conclusão
235329

236-
É isso pessoal. Obrigado pela leitura e até o próximo tutorial!
330+
É 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.
237331

238-
### Referências
332+
## Referências
239333

240334
* [Documentação do Peewee (em inglês)](http://peewee.readthedocs.io/en/latest/index.html)
241335
* [An Intro to peewee – Another Python ORM](https://www.blog.pythonlibrary.org/2014/07/17/an-intro-to-peewee-another-python-orm/)
242336
* [Introduction to peewee](http://jonathansoma.com/tutorials/webapps/intro-to-peewee/)
243-
* [Introdução à Linguagem SQL](https://www.novatec.com.br/livros/introducao-sql/)
244-
337+
* [Introdução à Linguagem SQL](https://www.novatec.com.br/livros/introducao-sql/)

0 commit comments

Comments
 (0)