TIL-033 | Django_C.R.U.D #1

Lee, Chankyu·2021년 10월 28일
0
post-thumbnail

C.R.U.D 실습 - starbucks 모델링

📝 starbucks ERD를 바탕으로 Django의 model을 구현하고 연동된
mySQL database에 데이터를 입력하는 실습을 진행하였다.


1. Django 및 git 초기 세팅

  • 지난 포스팅에서 진행하였던 django 초기 세팅 절차에 따라 진행하여 프로젝트를 생성하여 준다.
  • 생성한 django 프로젝트를 git 으로 관리할 수 있도록 초기화 한다.

2. github Repository 생성 및 로컬 프로젝트와 연동

  • remote 추가하여 준다.

    $ git remote add origin repository 주소

  • 완료된 초기 세팅 main 브랜치에 push

    $ git push origin main #여기서 main은 branch 이름

3. branch 생성 및 실습 시작

  • feature/crud 브랜치 생성 하고 생성한 브랜치로 이동(checkout)

    $ git branch 브랜치 이름
    $ git checkout 브랜치 이름

4. django application 생성

  • 초기세팅 완료된 django 프로젝트 내에서 products app 생성한다.

    $ python manage.py startapp products

  • setting.py에 생성한 app 추가한다.
# settings.py

INSTALLED_APPS = [
	...
	'products',
]

5. models.py 에 class 작성하여 database table 생성하기

  • app 생성 후 자동으로 생성된 models.py에서 database에서 생성될 테이블, 필드 등을 설정할 수 있다.
  • django 에서 제공해주는 models 를 상속받아 클래스를 작성한다.

참고 ERD

  • 지난번 진행하였던 스타벅스 모델링 결과물을 바탕으로 django models.py의 클래스를 작성한다.

내가 작성한 models.py

from django.db import models

# Create your models here.
class Menu(models.Model):
    name = models.CharField(max_length=45)

    class Meta:
        db_table = 'menu'

class Category(models.Model):
    name = models.CharField(max_length=45)
    menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

    class Meta:
        db_table = 'categories'

class Product(models.Model):
    K_name = models.CharField(max_length=45)
    E_name = models.CharField(max_length=45)
    description = models.TextField()
    nutrition = models.ForeignKey('Nutrition', on_delete=models.CASCADE)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

    class Meta:
        db_table = 'products'

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=45)
    size_fluid_ounce = models.CharField(max_length=45)

    class Meta:
        db_table = 'nutritions'

class Image(models.Model):
    image_url = models.CharField(max_length=2000)
    product = models.ForeignKey('Product', on_delete=models.CASCADE)
    
    class Meta:
        db_table = 'images'

class Allegy(models.Model):
    name = models.CharField(max_length=45)

    class Meta:
        db_table = 'allegy'

class Allegy_product(models.Model):
    allegy = models.ForeignKey('Allegy', on_delete=models.CASCADE)
    product = models.ForeignKey('Product', on_delete=models.CASCADE)

    class Meta:
        db_table = 'allegy_products'
  • 모델 작성 후 database 반영을 위해 makemigrations 명령과 migrate 명령을 진행해야 한다.

    $ python manage.py makemigrations (app이름)
    $ python manage.py migrate

6. mySQL 접속 및 생성된 Table 확인

$ mysql -u root -p
password 입력

👉 mySQL 접속완료

$ use "데이터베이스 명"
👉초기 세팅시 생성한 데이터베이스를 사용한다.
$ show tables;
👉 사용하고 있는 데이터베이스 내에서 생성된 테이블들의 목록을 확인할 수 있다.
$ desc table명
👉 생성된 테이블들의 정보를 확인할 수 있다. (field, type, key 등)
$ SELECT * FROM table명;
👉 테이블을 선택한 후 테이블에 입력된 데이터를 확인 할 수 있다.
데이터가 입력되지 않았을때는 "empty set" 이 반환된다.

7. 데이터 삽입

  • python shell 에서 데이터 삽입을 진행한다.
  • QuerySet API를 잘 다루는게 중요하므로 지속적인 연습이 필요하다.

    $ python manage.py shell

# python manage.py shell

>>> Menu.objects.create(name="음료")
>>> Allegy.objects.create(name="우유")
>>> Allegy_product.objects.create(allegy_id=1, product_id=1)
>>> Category.objects.create(name="콜드 브루 커피", menu_id=1)		
>>> Categories.objects.create(name = "콜드 브루 커피", menu=Menu.objects.get(name = "음료")
# a1 = Menu.objects.get(name = "음료")라고 해서 변수a1을 넣어주는게 편하니 그렇게 써도됨
>>> Nutrition.objects.create(one_serving_kcal = 75, sodium_mg = 20, saturated_fat_g = 2, sugars_g = 10, protein_g = 1, caffeine_mg = 245, size_ml = 355, size_fluid_ounce = 12)

mySQL Table Auto-increment 값 재정렬

  • 데이터를 입력하다보면 테이블에 이미 입력된 데이터 행을 삭제하거나 수정해야 할일이 생기기 마련이다. 행을 삭제하고 데이터를 입력하면 삭제된 id 값에 데이터가 할당되는게 아니라 그 다음 id값을 부여받게 된다. 이럴 경우 auto-increment 값을 재정렬 해줘야 한다.

$ SET @CNT=0;
$ UPDATE products SET products.id=@CNT:=@CNT+1;

  • 위의 명령어 입력 후 새로운 데이터를 입력하게 되면 삭제된 id 값을 부여 받게 된다.
  • 그러나 그 다음 새로운 데이터를 입력하면 또 id값이 한 칸 건너 띄고 생성된다. 예를들어, id=3 데이터를 삭제한 후 위의 명령어 수행 후 데이터를 입력하면 id값 3번을 부여받지만 그 다음 데이터의 id는 5가 된다. 이를 해결하기 위해서는 auto-increment 초기화가 필요하다.

AUTO-INCREMENT 초기화

  • 위의 경우에서 재정렬을한 후에 auto-increment를 초기화해줘야 새로운 데이터를 추가해줬을때 id값이 4부터 시작하기 때문에 아래와 같은 명령어를 입력하여 auto-increment를 초기화한다.

$ ALTER TABLE products AUTO_INCREMENT=4;

8. Github push 및 PR(Pull Request) 요청하기

$ git add .
$ git commit -m "커밋 메시지"
$ git push origin "브랜치 명"

profile
Backend Developer - "Growth itself contains the germ of happiness"

0개의 댓글