Django에서는 데이터베이스를 설계하는데 있어서 app 디렉토리에 있는 models.py 파일에서 모든것이 이루어진다고 말할 수 있다.
from django.db import models
# Create your models here.
class Menu(models.Model):
name = models.CharField(max_length=20)
class Meta:
db_table = "Menus"
class Category(models.Model):
name = models.CharField(max_length=20)
menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
class Meta:
db_table = "Categories"
class Drink(models.Model):
korean_name = models.CharField(max_length=100)
english_name = models.CharField(max_length=100)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
description = models.TextField()
class Meta:
db_table = "Drinks"
class Allergy(models.Model):
name = models.CharField(max_length=100)
drink = models.ManyToManyField('Drink', through='Allergy_drink')
class Meta:
db_table = "Allergies"
class Allergy_drink(models.Model):
allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
class Meta:
db_table = "Allergy_drinks"
class Nutrition(models.Model):
one_serving_kca = models.DecimalField(max_digits = 5, decimal_places = 2)
sodium_mg = models.DecimalField(max_digits = 5, decimal_places = 2)
saturated_fat_g = models.DecimalField(max_digits = 5, decimal_places = 2)
sugars_g = models.DecimalField(max_digits = 5, decimal_places = 2)
protein_g = models.DecimalField(max_digits = 5, decimal_places = 2)
caffeine_mg = models.DecimalField(max_digits = 5, decimal_places = 2)
drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
size_mi = models.CharField(max_length=20)
size_fluid_ounce = models.CharField(max_length=20)
class Meta:
db_table = "Nutritions"
class Image(models.Model):
image_url = models.CharField(max_length=500)
drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
class Meta:
db_table = "Images"
이렇게 models.py 에서 만들어진 class 는 Database에서 테이블로 생성된다고 생각하면 된다. 여기서는 각각의 입력값들이 무엇을 의미하는지에 대해서는 언급하지 않을 것이다. Django를 공부하면서 느낀것이 sql 문법을 알지 못해도 파이썬 문법만으로 데이터베이스를 생성하고 관리할 수 있다는 것이다.
Django에서 데이터베이스를 관리하는데 있어서 중요한 역할을 하는것이 makemigrations, migrate 명령어인데 이 두개의 명령어는 ORM을 가능하게 해주는 명령어이다.
ORM은 Object Relational Mapping의 줄임말인데 한글로는 객체-관계 매핑 즉, 객체를 관계형 데이터베이스와 연결해주는 개념이라고 생각하면 된다.
객체지향에서는 클래스라는 개념이 있지만, 관계형 데이터베이스에는 테이블이라는 개념이 있다.
프로그래밍 쪽에서는 웬만해서는 객체지향 패러다임으로 만드는 경우가 많은데, 관계형 데이터베이스를 이용하면서도 객체에 대한 표현에 제약을 받지 않고 객체처럼 사용하기 위해서 사용되는 기술이라고 이해하면 좋을것 같다.
위에서 선언된 class 들을 데이터베이스에 연동해 테이블로 만들고 싶을때 manage.py가 있는 디렉토리에서 python manage.py makemigrations '만든 app 이름' 을 입력하면 makemigrations 을 실행시킴으로서, 내가 models.py에서 모델을 변경시킨 사실(class 생성이 될수도 있고, 수정이 될수도 있고 삭제가 될수도 있다.)을 migration으로 저장시키고 싶다는 것을 Django에게 알려준다. 이렇게 되면
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
],
options={
'db_table': 'Categories',
},
),
migrations.CreateModel(
name='Menu',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
],
options={
'db_table': 'Menus',
},
),
migrations.CreateModel(
name='Drink',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('korean_name', models.CharField(max_length=100)),
('english_name', models.CharField(max_length=100)),
('description', models.TextField()),
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.category')),
],
options={
'db_table': 'Drinks',
},
),
migrations.AddField(
model_name='category',
name='menu',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.menu'),
),
]
migrations 디렉토리가 생성이 된다. 위에서 보이는것처럼 코드가 저절로 만들어진다. makemigrations 명령어를 입력했을때는 아직 데이터베이스에 적용되기 전이다!
python manage.py migrate를 입력하면 위에 만들어진 코드를 바탕으로 sql구문으로 저절로 바꿔주면서 데이터베이스에 적용된다. 즉, 테이블들이 생성된다.
이렇게 우리는 makemigrations,migrate을 통해서 sql 문법을 알지 못해도 데이터베이스를 컨트롤 할 수 있다.