Resumo : neste tutorial, você aprenderá sobre Django ORM e como usar a API Django ORM para interagir com bancos de dados relacionais.
Introdução ao Django ORM
ORM significa mapeamento objeto-relacional. ORM é uma técnica que permite manipular dados em um banco de dados relacional usando programação orientada a objetos.
Django ORM permite que você use a mesma API Python para interagir com vários bancos de dados relacionais, incluindo PostgreSQL, MySQL, Oracle e SQLite. Veja uma lista completa de bancos de dados suportados aqui .
Django ORM usa o padrão de registro ativo :
- Uma classe é mapeada para uma única tabela no banco de dados. A classe geralmente é chamada de classe modelo.
- Um objeto da classe é mapeado para uma única linha da tabela.
Depois de definir uma classe de modelo, você poderá acessar métodos predefinidos para criar, ler, atualizar e excluir dados.
Além disso, o Django gera automaticamente um site de administração para gerenciar os dados dos modelos. Vamos dar uma olhada em um exemplo simples para ver como funciona o Django ORM.
Configurando um projeto base
Montaremos um projeto base com um novo ambiente virtual.
Criando um novo ambiente virtual
Primeiro, crie um novo ambiente virtual usando o módulo integrado venv
:
python -m venv venv
Linguagem de código: Python ( python )
Segundo, ative o ambiente virtual:
venv\scripts\activate
Linguagem de código: Python ( python )
Terceiro, instale o pacote django
& django-extensions
:
pip install django django-extensions
Linguagem de código: Python ( python )
O django-extensions
pacote fornece algumas extensões personalizadas para o framework Django. Usaremos django-extensions
package para gerar o SQL gerado pelo Django ORM.
Criando um novo projeto
Primeiro, crie um novo projeto Django chamado django_orm
:
django-admin startproject django_orm
Linguagem de código: Python ( python )
Segundo, crie um HR
aplicativo dentro do django_orm
projeto:
cd django_orm
python manage.py startapp hr
Linguagem de código: Python ( python )
Terceiro, registre ambos hr
e django_extensions
no INSTALLED_APPS
do settings.py
projeto:
INSTALLED_APPS = [
# ...
'django_extensions',
'hr',
]
Linguagem de código: Python ( python )
Configurando o servidor de banco de dados PostgreSQL
Primeiro, instale um servidor de banco de dados PostgreSQL em seu computador local .
Segundo, faça login no servidor de banco de dados PostgreSQL. Ele solicitará a senha do postgres
usuário. Observe que você usa a mesma senha digitada para o postgres
usuário durante a instalação.
psql -U postgres
Password for user postgres:
Linguagem de código: Python ( python )
Terceiro, crie um novo banco de dados com o nome hr
e tipo exit
para sair do psql
programa:
postgres=# create database hr;
CREATE DATABASE
postgres=# exit
Linguagem de código: Python ( python )
Conectando-se ao PostgreSQL do Django
Primeiro, configure a conexão com o banco de dados no settings.py
projeto django_orm
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'hr',
'USER': 'postgres',
'PASSWORD': 'POSTGRES_PASSWORD',
'HOST': 'localhost',
'PORT': '',
}
}
Linguagem de código: Python ( python )
Observe que você altera a POSTGRES_PASSWORD
sua senha.
Segundo, instale o psycopg2
pacote para permitir que o Django se conecte ao PostgreSQL
servidor de banco de dados:
pip install psycopg2
Linguagem de código: Python ( python )
Terceiro, execute o servidor de desenvolvimento Django:
python manage.py runserver
Linguagem de código: Python ( python )
Você verá a página inicial padrão do Django:
Definindo um modelo
Primeiro, defina uma Employee
classe no hr
aplicativo que tenha dois campos first_name
e last_name
:
from django.db import models
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
def __str__(self):
return f'{self.first_name} {self.last_name}'
Linguagem de código: Python ( python )
Segundo, faça migrações usando o makemigrations
comando:
python manage.py makemigrations
Linguagem de código: Python ( python )
Saída:
Migrations for 'hr':
hr\migrations\0001_initial.py
- Create model Employee
Linguagem de código: Python ( python )
Terceiro, propague as alterações no banco de dados usando o migrate
comando:
python manage.py migrate
Linguagem de código: Python ( python )
O Django cria muitas tabelas, incluindo aquelas para os modelos integrados, como User
e Group
. Neste tutorial, vamos nos concentrar na Employee
classe.
Com base na Employee
classe model, Django ORM cria uma tabela hr_employee
no banco de dados:
Django combina o nome do aplicativo e o nome da classe para gerar o nome da tabela:
app_modelclass
Linguagem de código: Python ( python )
Neste exemplo, o nome do aplicativo é hr
e o nome da classe é Employee
. Portanto, o Django cria a tabela com o nome hr_employee
. Observe que o Django converte o nome da classe em letras minúsculas antes de anexá-lo ao nome do aplicativo.
A Employee
classe do modelo possui dois campos first_name
e last_name
. Como a classe Employee herda da models.Model
classe, o Django adiciona automaticamente o campo id como um campo de incremento automático chamado id
. Portanto, a hr_employee
tabela possui três colunas id
, first_name
, e last_name
.
Para interagir com a hr_employee
tabela, você pode executar o shell_plus
comando que vem do django-extensions
pacote.
Observe que o Django fornece um comando integrado shell
. No entanto, o shell_plus
comando é mais conveniente de trabalhar. Por exemplo, carrega automaticamente os modelos definidos no projeto e exibe o SQL gerado.
Execute o shell_plus
comando com a --print-sql
opção:
python manage.py shell_plus --print-sql
Linguagem de código: Python ( python )
Inserindo dados
Primeiro, crie um novo Employee
objeto e chame o save()
método para inserir uma nova linha na tabela:
>>> e = Employee(first_name='John',last_name='Doe')
>>> e.save()
INSERT INTO "hr_employee" ("first_name", "last_name")
VALUES ('John', 'Doe') RETURNING "hr_employee"."id"
Execution time: 0.003234s [Database: default]
Linguagem de código: Python ( python )
Neste exemplo, você não precisa definir o valor da coluna id. O banco de dados gera automaticamente seu valor e o Django irá defini-lo assim que você inserir uma nova linha na tabela.
Conforme mostrado na saída, o Django usa a INSERT
instrução para inserir uma nova linha com duas colunas first_name
na last_name
tabela hr_employee
.
Segundo, insira o segundo funcionário com o nome Jane
e sobrenome Doe
:
>>> e = Employee(first_name='Jane',last_name='Doe')
>>> e.save()
INSERT INTO "hr_employee" ("first_name", "last_name")
VALUES ('Jane', 'Doe') RETURNING "hr_employee"."id"
Execution time: 0.002195s [Database: default]
Linguagem de código: Python ( python )
Agora, a hr_employee
tabela tem duas linhas com id 1 e 2.
Selecionando dados
Para selecionar todas as linhas da hr_employees
tabela, você usa o all()
método como este:
>>> Employee.objects.all()
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name"
FROM "hr_employee"
LIMIT 21
Execution time: 0.001856s [Database: default]
<QuerySet [<Employee: John Doe>, <Employee: Jane Doe>]>
Linguagem de código: Python ( python )
Como funciona.
- Primeiro, o Django usa a
SELECT
instrução para selecionar linhas dahr_employee
tabela. - Segundo, o Django converte linhas em
Employee
objetos e retorna umQuerySet
que contém osEmployee
objetos.
Observe que LIMIT
foi adicionado pelo Django para retornar 21 registros para exibição no shell.
Para selecionar uma única linha por ID, você pode usar o get()
método. Por exemplo, o seguinte retorna o funcionário com id 1:
>>> e = Employee.objects.get(id=1)
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name"
FROM "hr_employee"
WHERE "hr_employee"."id" = 1
LIMIT 21
Execution time: 0.001003s [Database: default]
>>> e
<Employee: John Doe>
Linguagem de código: Python ( python )
Ao contrário do all()
método, o get()
método retorna um Employee
objeto em vez de um arquivo QuerySet
.
Para localizar funcionários pelo primeiro nome, você pode usar o filter()
método do QuerySet
objeto. Por exemplo, o seguinte encontra funcionários com o primeiro nome Jane
:
>>> Employee.objects.filter(first_name='Jane')
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name"
FROM "hr_employee"
WHERE "hr_employee"."first_name" = 'Jane'
LIMIT 21
Execution time: 0.000000s [Database: default]
<QuerySet [<Employee: Jane Doe>]>
Linguagem de código: Python ( python )
Atualizando dados
Primeiro, selecione o funcionário com id 2:
>>> e = Employee.objects.get(id=2)
SELECT "hr_employee"."id",
"hr_employee"."first_name",
"hr_employee"."last_name"
FROM "hr_employee"
WHERE "hr_employee"."id" = 2
LIMIT 21
Execution time: 0.001022s [Database: default]
Linguagem de código: Python ( python )
Segundo, atualize o sobrenome do funcionário selecionado para Smith
:
>>> e.last_name = 'Smith'
>>> e.save()
UPDATE "hr_employee"
SET "first_name" = 'Jane',
"last_name" = 'Smith'
WHERE "hr_employee"."id" = 2
Execution time: 0.004019s [Database: default]
>>> e
<Employee: Jane Smith>
Linguagem de código: Python ( python )
Excluindo dados
Para excluir uma instância de um modelo, você usa o delete()
método. O exemplo a seguir exclui o funcionário com id 2:
>>> e.delete()
DELETE
FROM "hr_employee"
WHERE "hr_employee"."id" IN (2)
Execution time: 0.002001s [Database: default]
(1, {'hr.Employee': 1})
Linguagem de código: Python ( python )
Para excluir todas as instâncias de um modelo, use o all()
método para selecionar todos os funcionários e chame o delete()
método para excluir todos os funcionários selecionados:
>>> Employee.objects.all().delete()
DELETE
FROM "hr_employee"
Execution time: 0.001076s [Database: default]
(1, {'hr.Employee': 1})
Linguagem de código: Python ( python )
Django usa a DELETE
instrução sem WHERE
cláusula para excluir todas as linhas da hr_employee
tabela.
Baixe o Django ORM aqui.
Resumo
- Django ORM permite interagir com bancos de dados relacionais usando API Python.
- Django ORM usa o padrão de registro ativo, no qual uma classe é mapeada para uma tabela e um objeto mapeado para uma linha.
- Use
all()
o método para obter todas as linhas de uma tabela. - Use
get()
o método para selecionar uma linha por id. - Use
filter()
o método para filtrar linhas por um ou mais campos. - Use
save()
o método para criar uma nova linha ou atualizar uma linha existente. - Use
delete()
o método para excluir uma ou mais linhas de uma tabela.