You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Summary: Conheça o Peewee, um prático e minimalista ORM Python
12
12
13
13
[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.
15
14
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.
17
16
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.
19
18
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.
21
20
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+.
23
22
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).
25
24
26
-
O Peewee pode ser facilmente instalado com o gerenciador de pacotes *pip*:
25
+
## Instalação
27
26
28
-
```bash
27
+
O Peewee pode ser facilmente instalado com o gerenciador de pacotes *pip* (recomendo a instalação em um virtualenv):
28
+
29
+
```
29
30
pip install peewee
30
31
```
31
32
32
-
###Criando o banco de dados
33
+
## Criando o banco de dados
33
34
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).
35
36
36
37
```python
37
38
import peewee
38
39
40
+
# Aqui criamos o banco de dados
39
41
db = peewee.SqliteDatabase('codigo_avulso.db')
40
42
41
43
```
42
44
43
45
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.
44
46
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
48
49
sudo apt-get install sqlitebrowser
49
50
```
50
51
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:
52
55
53
56
```python
57
+
# models.py
58
+
54
59
import peewee
55
60
61
+
# Criamos o banco de dados
56
62
db = peewee.SqliteDatabase('codigo_avulso.db')
57
63
58
-
classAuthor(peewee.Model):
59
-
"""
60
-
Classe que representa a tabela Author
61
-
"""
62
64
63
-
# A tabela possui apenas o campo 'name', que
64
-
# receberá o nome do autor
65
-
name = peewee.CharField()
65
+
classBaseModel(peewee.Model):
66
+
"""Classe model base"""
66
67
67
68
classMeta:
68
69
# Indica em qual banco de dados a tabela
69
70
# 'author' sera criada (obrigatorio). Neste caso,
70
-
# utilizamos o banco 'codigo_avulso.db' criado anteriormente.
71
+
# utilizamos o banco 'codigo_avulso.db' criado anteriormente
71
72
database = db
72
73
73
74
```
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:
75
79
76
80
```python
77
-
import peewee
81
+
# models.py
78
82
79
-
db = peewee.SqliteDatabase('codigo_avulso.db')
83
+
classAuthor(BaseModel):
80
84
81
-
classBook(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
+
classBook(BaseModel):
82
100
"""
83
101
Classe que representa a tabela Book
84
102
"""
85
103
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)
89
106
90
107
# Chave estrangeira para a tabela Author
91
108
author = peewee.ForeignKeyField(Author)
92
109
93
-
classMeta:
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
98
110
```
99
111
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`.
101
113
102
114
```python
103
-
104
-
import peewee
105
-
from model import Author, Book
106
-
115
+
# models.py
107
116
108
117
if__name__=='__main__':
109
118
try:
110
119
Author.create_table()
120
+
print("Tabela 'Author' criada com sucesso!")
111
121
except peewee.OperationalError:
112
-
print'Tabela Author ja existe!'
122
+
print("Tabela 'Author' ja existe!")
113
123
114
124
try:
115
125
Book.create_table()
126
+
print("Tabela 'Book' criada com sucesso!")
116
127
except peewee.OperationalError:
117
-
print'Tabela Book ja existe!'
128
+
print("Tabela 'Book' ja existe!")
129
+
```
130
+
excerpt
131
+
Agora executamos o `models.py`:
118
132
133
+
```
134
+
python models.py
119
135
```
120
136
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:
122
138
123
-
```bash
139
+
```shell
124
140
.
125
141
├── codigo_avulso.db
126
-
├── main.py
127
-
├── model.py
142
+
├── models.py
128
143
```
129
144
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`.
131
146
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.
133
172
134
173
```python
174
+
# create.py
175
+
176
+
from models import Author, Book
135
177
136
178
# Inserimos um autor de nome "H. G. Wells" na tabela 'Author'
137
179
author_1 = Author.create(name='H. G. Wells')
138
180
181
+
# Inserimos um autor de nome "Julio Verne" na tabela 'Author'
182
+
author_2 = Author.create(name='Julio Verne')
183
+
139
184
book_1 = {
140
185
'title': 'A Máquina do Tempo',
141
-
'author': author_1,
186
+
'author_id': author_1,
142
187
}
143
188
144
189
book_2 = {
145
190
'title': 'Guerra dos Mundos',
146
-
'author': author_1,
191
+
'author_id': author_1,
147
192
}
148
193
149
-
# Inserimos um autor de nome "Julio Verne" na tabela 'Author'
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()`.
172
214
173
215
```python
216
+
# read.py
217
+
218
+
from models import Author, Book
219
+
174
220
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
176
225
```
226
+
177
227
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".
178
228
179
229
```python
230
+
# read.py
231
+
180
232
books = Book.select().join(Author).where(Author.name=='H. G. Wells')
181
233
182
234
# Exibe a quantidade de registros que corresponde a nossa pesquisa
183
-
printbooks.count()
235
+
print(books.count())
184
236
185
237
for book in books:
186
-
book.title
238
+
print(book.title)
187
239
188
240
# Resultado:
189
241
# * A Máquina do Tempo
@@ -194,51 +246,92 @@ for book in books:
194
246
195
247
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)).
196
248
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
198
260
199
261
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.
200
262
201
263
Primeiro vamos buscar o registro do autor e do livro:
book = Book.get(Book.title=="Vinte Mil Leguas Submarinas")
206
272
```
273
+
207
274
Agora vamos alterar o autor e gravar essa alteração no banco.
208
275
209
276
```python
277
+
# update.py
278
+
210
279
# Alteramos o autor do livro
211
280
book.author = new_author
212
281
213
282
# Salvamos a alteração no banco
214
283
book.save()
215
284
```
216
285
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
218
298
219
299
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.
220
300
221
301
```python
302
+
# delete.py
303
+
304
+
from models import Author, Book
305
+
222
306
# Buscamos o livro que desejamos excluir do banco
223
307
book = Book.get(Book.title=="Guerra dos Mundos")
224
308
225
309
# Excluimos o livro do banco
226
310
book.delete_instance()
311
+
227
312
```
313
+
228
314
Simples não?
229
315
230
-
### Conclusão
316
+
A estrutura do diretório ficou assim:
231
317
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
+
```
233
327
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
235
329
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.
237
331
238
-
###Referências
332
+
## Referências
239
333
240
334
*[Documentação do Peewee (em inglês)](http://peewee.readthedocs.io/en/latest/index.html)
241
335
*[An Intro to peewee – Another Python ORM](https://www.blog.pythonlibrary.org/2014/07/17/an-intro-to-peewee-another-python-orm/)
242
336
*[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