O Django é um ótimo framework para iniciar um projeto completamente do zero, mas nem sempre este é nosso caso. Imagine que uma empresa pretende migrar uma aplicação legada (antiga) com 100 tabelas em seu banco de dados e escolhe o Django como sua nova tecnologia… Como faríamos para mapear todo o banco de dados (tabelas e relações) para nosso projeto? Parece algo cansativo e complicado, certo!? Bom, com o Django, isso pode ser mais fácil do que parece…
Banco de Dados
Para nosso exemplo, iremos utilizar um banco de dados com uma estrutura que armazena a lista de empregados de uma empresa e suas relações. Não vamos nos preocupar com a estrutura do banco de dados em si, o importante aqui é entender que teremos 6 tabelas com os seguintes campos:
Para criar o banco de dados acima em seu MySQL, precisamos baixar toda a sua estrutura no repositório encontrado no seguinte link:
Depois disso, vamos baixar seu código-fonte e salvar no Desktop do nosso computador. Depois de descompactado, utilizamos o terminal para incorporar o banco de dados teste para o MySQL presente em nossa máquina. Para isso, no terminal (ou CMD), utilizamos o seguinte comando:
mysql -u root -p < employees.sql
Lembrando que o “root” é o nome do usuário do banco de dados. Caso o seu seja diferente, informe-o na instrução acima :)
Depois disso, o banco employees será criado no MySQL:
Lembrando que o BD que utilizamos já virá populado, contendo mais de 300,000 empregados registrados. Situação parecida ao que descrevemos anteriormente:
Configurando aplicação
Após criar o banco de dados, estamos prontos para mapeá-lo em nosso projeto Django. Para isso, partiremos de uma aplicação “zerada”, apenas com o projeto e uma app criada. Além disso, precisamos instalar, obviamente, o Django e o mysqlclient em nossa virtualenv:
Além disso, precisamos configurar o projeto para se comunicar com o banco de dados que acabamos de importar. Para isso, no arquivo settings.py do nosso projeto, determinamos seus parâmetros de conexão:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'employees',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306'
}
}
Com isso, temos nossa aplicação criada e se comunicando com o banco de dados o
Curso Django - Banco de dados com Django ORM - Parte 1
Conhecer o cursoMapeando o banco de dados no Django
Depois de configurar a aplicação, chegou a hora tão esperada: mapear o banco de dados para nosso arquivo models.py :D
Para isso, é muito simples (e você vai se impressionar com isso). Tudo que temos que fazer é abrir o terminal integrado do PyCharm e digitar o seguinte comando:
python manage.py inspectdb > nome_da_app.models.py
Lembrando que “nome_da_app” deve ser alterada pelo nome da sua app no projeto, hein!? :)
Após isso, no arquivo models.py da nossa aplicação, teremos o seguinte resultado:
from django.db import models
class Departments(models.Model):
dept_no = models.CharField(primary_key=True, max_length=4)
dept_name = models.CharField(unique=True, max_length=40)
class Meta:
managed = False
db_table = 'departments'
class DeptEmp(models.Model):
emp_no = models.ForeignKey('Employees', models.DO_NOTHING, db_column='emp_no', primary_key=True)
dept_no = models.ForeignKey(Departments, models.DO_NOTHING, db_column='dept_no')
from_date = models.DateField()
to_date = models.DateField()
class Meta:
managed = False
db_table = 'dept_emp'
unique_together = (('emp_no', 'dept_no'),)
class DeptManager(models.Model):
emp_no = models.ForeignKey('Employees', models.DO_NOTHING, db_column='emp_no', primary_key=True)
dept_no = models.ForeignKey(Departments, models.DO_NOTHING, db_column='dept_no')
from_date = models.DateField()
to_date = models.DateField()
class Meta:
managed = False
db_table = 'dept_manager'
unique_together = (('emp_no', 'dept_no'),)
class Employees(models.Model):
emp_no = models.IntegerField(primary_key=True)
birth_date = models.DateField()
first_name = models.CharField(max_length=14)
last_name = models.CharField(max_length=16)
gender = models.CharField(max_length=1)
hire_date = models.DateField()
class Meta:
managed = False
db_table = 'employees'
class Salaries(models.Model):
emp_no = models.ForeignKey(Employees, models.DO_NOTHING, db_column='emp_no', primary_key=True)
salary = models.IntegerField()
from_date = models.DateField()
to_date = models.DateField()
class Meta:
managed = False
db_table = 'salaries'
unique_together = (('emp_no', 'from_date'),)
class Titles(models.Model):
emp_no = models.ForeignKey(Employees, models.DO_NOTHING, db_column='emp_no', primary_key=True)
title = models.CharField(max_length=50)
from_date = models.DateField()
to_date = models.DateField(blank=True, null=True)
class Meta:
managed = False
db_table = 'titles'
unique_together = (('emp_no', 'title', 'from_date'),)
Exatamente a mesma estrutura (com seus atributos e relacionamentos) presentes no banco de dados que incorporamos ao MySQL da nossa máquina. Bem legal, né!?
Imagine ter que mapear todas essas entidades, avaliando seus tipos de dados e relações… Seria um trabalho bem cansativo, concorda? Com o Django, um simples comando consegue resolver este problema :)
Agora, já estamos prontos para utilizar todo o poder do ORM do Django para manipular o banco de dados e, consequentemente, criar nossa nova aplicação o