스타벅스 데이터베이스 테이블 만들기

Jeongyun Heo·2021년 1월 23일
1
post-thumbnail

How to Reset Migrations
https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html

🚫  주의사항

- 터미널 새로 열 때마다 가상환경 활성화 시키는 거 잊지 말기
conda activate "wecafe17"

- django shell 새로 열 때마다 import 하는 거 잊지 말기
./manage.py shell
from products.models import Menu, Category, Drink
(products 패키지에 있는 models.py 모듈에서 만든 Class import)

- 처음에 models.py 입력할 때 한 번에 제대로 입력하기!!!
처음부터 입력 잘 해야 됨. 나중에 클래스 수정하게 되면 골치 아픔.
처음부터 잘 입력하면 Foreign Key에 null=True 안 넣어도 잘 된다...

- 인스턴스 create 할 때 Foreign Key도 입력해줘야 됨
Primary Key(id)가 자동으로 들어가니까 Foreign Key도 자동으로 들어가는 건 줄 알았는데 생각해보니 내가 지정해주지 않는 이상, Foreign Key가 어느 Primary Key를 참조해야 되는지 어떻게 알아? 모르는 게 당연한 거..

>>> Category.objects.create(name="콜드 브루 커피", menu_id=1) # menu_id가 FK
<Category: Category object (1)>
>>> Drink.objects.create(korean_name='나이트로 바닐라 크림', 
english_name='Nitro Vanilla Cream', 
description="부드러운 목넘김의 나이트로 커피와 바닐라 크림의 매력을 한번에 느껴보세요!",
category_id=1)  # category_id가 FK
<Drink: Drink object (1)>

- 복붙할 때 따옴표 이상하게 들어가는 거 주의
메모에 복사해놓고 그대로 복사해서 쓰려니까 SyntaxError 에러 남
SyntaxError: EOL while scanning string literal
SyntaxError : Invalid Character in identifier
따옴표가 이상하게 바뀌어서 에러가 났음.. 따옴표 지우고 다시 입력해주니까 에러 안 남...
메모에서 인용부호 자동으로 바꿔주는 기능이 있어서 그랬음.. 그 기능 끔...

- 데이터베이스 삭제 및 migrations 디렉터리 파일들 삭제
계속 오류 나면 해당 데이터베이스 삭제 하고 데이터베이스 다시 생성하기
products 디렉터리의 migrations 디렉터리에 있는 것들 __init__.py 빼고 다 지우기

mysql> DROP database wetwosome;    # 데이터베이스 삭제

mysql> CREATE DATABASE wetwosome character set utf8mb4 collate utf8mb4_general_ci;    # 데이터베이스 다시 생성

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete    # migrations 디렉터리 안에 있는 거 삭제

find . -path "*/migrations/*.pyc" -delete    # __pycache__ 디렉터리 안에 있는 것들 삭제

python manage.py makemigrations products

python manage.py migrate products


models.py 작성 (테이블 만들기)

# models.py

from django.db import models

class Menu(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table = 'menu'


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=50)
    english_name = models.CharField(max_length=50)
    description = models.TextField(blank=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

    class Meta:
        db_table = 'drinks'

models.py 추가 버전

~/projects/wecafe17/products

from django.db import models

class Menu(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table = 'menu'


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=50)
    english_name = models.CharField(max_length=50)
    description = models.TextField(blank=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

    class Meta:
        db_table = 'drinks'


class Allergy(models.Model):
    name = models.CharField(max_length=50)

    class Meta:
        db_table = 'allergy'

class AllergyDrink(models.Model):
    allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
    drink = models.ForeignKey('Drink', on_delete=models.CASCADE)

    class Meta:
        db_table = 'allergy_drink'

class Nutrition(models.Model):
    one_serving_kcal = models.DecimalField(max_digits=6, decimal_places=2)
    sodium_mg = models.DecimalField(max_digits=6, decimal_places=2)
    saturated_fat_g = models.DecimalField(max_digits=6, decimal_places=2)
    sugars_g = models.DecimalField(max_digits=6, decimal_places=2)
    protein_g = models.DecimalField(max_digits=6, decimal_places=2)
    caffeine_mg = models.DecimalField(max_digits=6, decimal_places=2)
    size_ml = models.CharField(max_length=50)
    size_fluid_ounce = models.CharField(max_length=50)
    drink = models.ForeignKey('Drink', on_delete=models.CASCADE)

    class Meta:
        db_table = 'nutritions'

Category.objects.create

>>> Category.objects.create(name="콜드 브루 커피", menu_id=1)
<Category: Category object (1)>
>>> Category.objects.create(name="브루드 커피", menu_id=1)
<Category: Category object (2)>
>>> Category.objects.create(name="에스프레소", menu_id=1)
<Category: Category object (3)>
>>> Category.objects.create(name="프라푸치노", menu_id=1)
<Category: Category object (4)>
>>> Category.objects.create(name="블렌디드", menu_id=1)
<Category: Category object (5)>
>>> Category.objects.create(name="스타벅스 피지오", menu_id=1)
<Category: Category object (6)>

>>> Category.objects.all()
<QuerySet [<Category: Category object (1)>, <Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>, <Category: Category object (5)>, <Category: Category object (6)>]>

>>> Category.objects.values()
<QuerySet [{'id': 1, 'name': '콜드 브루 커피', 'menu_id': 1}, {'id': 2, 'name': '브루드 커피', 'menu_id': 1}, {'id': 3, 'name': '에스프레소', 'menu_id': 1}, {'id': 4, 'name': '프라푸치노', 'menu_id': 1}, {'id': 5, 'name': '블렌디드', 'menu_id': 1}, {'id': 6, 'name': '스타벅스 피지오', 'menu_id': 1}]>

Drink.objects.create

>>> Drink.objects.create(korean_name='나이트로 바닐라 크림', english_name='Nitro Vanilla Cream', description="부드러운 목넘김의 나이트로 커피와 바닐라 크림의 매력을 한번에 느껴보세요!", category_id=1)
<Drink: Drink object (1)>
>>> Drink.objects.create(korean_name='나이트로 콜드 브루', english_name='Nitro Cold Brew', description='나이트로 커피 정통의 캐스케이딩과 부드러운 콜드 크레마! 부드러운 목 넘김과 완벽한 밸런스에 커피 본연의 단맛을 경험할 수 있습니다.', category_id=1)
<Drink: Drink object (2)>
>>> Drink.objects.create(korean_name='아이스 커피', english_name='Iced Coffee', description="깔끔하고 상큼함이 특징인 시원한 아이스 커피", category_id=2)
<Drink: Drink object (3)>
>>> Drink.objects.create(korean_name='오늘의 커피', english_name='Brewed Coffee', description="신선하게 브루드(Brewed)되어 원두의 다양함이 살아있는 커피", category_id=2)
<Drink: Drink object (4)>
>>> Drink.objects.create(korean_name='더블 에스프레소 크림 라떼', english_name='Double Espresso Cream Latte', description="달콤한 바닐라와 부드러운 풍미의 블론  드 에스프레소! 음료 위에 올라간 블론드 에스프레소 크림은 입안을 부드럽게 감싸고  바닐라 커 피 칩이 뿌려져 더욱 진한 커피 향을 즐길 수 있습니다.", category_id=3)
<Drink: Drink object (5)>
>>> Drink.objects.create(korean_name='아이스 더블 에스프레소 크림 라떼', english_name='Iced Double Espresso Cream Latte', description="달콤한 바닐라와 부드러운 풍미의 블론드 에스프레소! 음료 위에 올라간 블론드 에스프레소 크림은 입안을 부드 럽게 감싸고 블론드 커피칩이 뿌려져 더욱 진한 커피 향을 즐길 수 있습니다.", category_id=3)
<Drink: Drink object (6)>
>>> Drink.objects.create(korean_name='더블 에스프레소 칩 프라푸치노', english_name='Double Espresso Chip Frappuccino', description='리스트레토 에스프레소 2샷과 에스프레소 칩, 하프앤하프가 달고 진하게 어우러진 커피의 기본에 충실한 더블 에스 프레소 칩 프라푸치노를 만나보세요.', category_id=4)
<Drink: Drink object (7)>
>>> Drink.objects.create(korean_name='모카 프라푸치노', english_name='Mocha Frappuccino', description='초콜릿, 커피와 얼음이 갈린 음료에 휘핑크림이 토핑된 음료 입니다.', category_id=4)
<Drink: Drink object (8)>
>>> Drink.objects.create(korean_name='홀 그레인 오트 블렌디드', english_name='Whole Grain Oat Blended', description='한 끼 식사처럼 든든하게 즐길 수 있는 음료! 귀리, 현미, 보리, 흑미, 백태, 검정콩, 검정깨를 오트밀크에 담아 백앙금으로 달콤한 맛을 더 한 음료와 함께 건강한 신년을 시작하세요(흑임자 찹쌀떡이 함께 블렌딩 되 어 씹히는 맛 이 매력적인 음료)', category_id=5)
<Drink: Drink object (9)>
>>> Drink.objects.create(korean_name='망고 패션 후르츠 블렌디드', english_name='Mango Passion Fruit Blended', description='진한 블랙 티에 망고 패션 후르츠 주스  가 조합된 아이스 블렌드 음료', category_id=5)
<Drink: Drink object (10)>
>>> Drink.objects.create(korean_name='블랙 티 레모네이드 피지오', english_name='Black Tea Lemonade Starbucks Fizzio', description='블랙 티와 상큼한 레모네이드를 스파클링한 시원하고 청량감 있는 음료입니다.', category_id=6)
<Drink: Drink object (11)>
>>> Drink.objects.create(korean_name='쿨 라임 피지오', english_name='Cool Lime Starbucks Fizzio', description='그린 빈 추출액이 들어간 라임 베이스에 건조된 라임 슬라이스를 넣고 스파클링한 시원하고 청량감 있는 음료입니다. (카페인이 함유된 탄산음료입니다)', category_id=6)
<Drink: Drink object (12)>
>>> Drink.objects.values()
<QuerySet [{'id': 1, 'korean_name': '나이트로 바닐라 크림', 'english_name': 'Nitro Vanilla Cream', 'description': '부드러운 목넘김의 나이트로 커피와 바닐라 크림의 매력을 한번에 느껴보세요!', 'category_id': 1}, {'id': 2, 'korean_name': '나이트로 콜드 브루', 'english_name': 'Nitro Cold Brew', 'description': '나이트로 커피 정통의 캐스케이딩과 부드러운 콜드 크레마! 부드러운  넘김과 완벽한 밸런스에 커피 본연의 단맛을 경험할  있습니다.', 'category_id': 1}, {'id': 3, 'korean_name': '아이스 커피', 'english_name': 'Iced Coffee', 'description': '깔끔하고 상큼함이 특징인 시원한 아이스 커피', 'category_id': 2}, {'id': 4, 'korean_name': '오늘의 커피', 'english_name': 'Brewed Coffee', 'description': '신선하게 브루드(Brewed)되어 원두의 다양함이 살아있는 커피', 'category_id': 2}, {'id': 5, 'korean_name': '더블 에스프레소 크림 라떼', 'english_name': 'Double Espresso Cream Latte', 'description': '달콤한 바닐라와 부드러운 풍미의 블론드 에스프레소! 음료 위에 올라간 블론드 에스프레소 크림은 입안을 부드럽게 감싸고 바닐라   칩이 뿌려져 더욱 진한 커피 향을 즐길  있습니다.', 'category_id': 3}, {'id': 6, 'korean_name': '아이스 더블 에스프레소 크림 라떼', 'english_name': 'Iced Double Espresso Cream Latte', 'description': '달콤한 바닐라와 부드러운 풍미의 블론드 에스프레소! 음료 위에 올라간 블론드 에스프레소 크림은 입안을 부드럽게 감싸고 블론드 커피칩이 뿌려져 더욱 진한 커피 향을 즐길  있습니다.', 'category_id': 3}, {'id': 7, 'korean_name': '더블 에스프레소  프라푸치노', 'english_name': 'Double Espresso Chip Frappuccino', 'description': '리스트레토 에스프레소 2샷과 에스프레소 칩, 하프앤하프가 달고 진하게 어우러진 커피의 기본에 충실한 더블 에스프레소  프라푸치노를 만나보세요.', 'category_id': 4}, {'id': 8, 'korean_name': '모카 프라푸치노', 'english_name': 'Mocha Frappuccino', 'description': '초콜릿, 커피와 얼음이 갈린 음료에 휘핑크림이 토핑된 음료입니다.', 'category_id': 4}, {'id': 9, 'korean_name': '홀 그레인 오트 블렌디드', 'english_name': 'Whole Grain Oat Blended', 'description': '한  식사처럼 든든하게 즐길  있는 음료! 귀리, 현미, 보리, 흑미, 백태, 검정콩, 검정깨를 오트밀크에 담아 백앙금으로 달콤한 맛을   음료와 함께 건강한 신년을 시작하세요(흑임자 찹쌀떡이 함께 블렌딩 되어 씹히는   매력적인 음료)', 'category_id': 5}, {'id': 10, 'korean_name': '망고 패션 후르츠 블렌디드', 'english_name': 'Mango Passion Fruit Blended', 'description': '진한 블랙 티에 망고 패션 후르츠 주스가 조합된 아이스 블렌드 음료', 'category_id': 5}, {'id': 11, 'korean_name': '블랙  레모네이드 피지오', 'english_name': 'Black Tea Lemonade Starbucks Fizzio', 'description': '블랙 티와 상큼한 레모네이드를 스파클링한 시원하고 청량감 있는 음료입니다.', 'category_id': 6}, {'id': 12, 'korean_name': '쿨 라임 피지오', 'english_name': 'Cool Lime Starbucks Fizzio', 'description': '그린  추출액이 들어간 라임 베이스에 건조된 라임 슬라이스를 넣고 스파클링한 시원하고 청량감 있는 음료입니다. (카페인이 함유된 탄산음료입니다)', 'category_id': 6}]>
>>>

0개의 댓글