[TIL] CRUD(1)

Hailee·2020년 11월 30일
0

[ TIL ]

목록 보기
22/40
post-thumbnail

dJango Web Framework

  • dJango를 활용한 application 개발의 핵심은
    URLconf, View, Model

이 중 Model 에 대한 이해를 해보는 실습이다!
훠후 글 쓰면서도 이해가 안되지만
데이터베이스와 관련된, table 생성 및 데이터 다루는 쿼리를 관리하는 Model이라는 객체를 생성한다고? 이해하고 진행할 예정!

WAS & Database 준비하기

우리가 만들 가상의 데이터를 올릴 WAS(Web Application Server)와 Database 생성해주기!

dJango, Database를 공부했으니 이제 백앤드 관점에서 Model을 작성하고
ORM을 통해서 Database table 생성하고 데이터 다루는 것을 실습하는 날이다.

학습목표

  1. Server - Databasedata flow 이해하기
  2. MVT 패턴 중 M 이해하기
  3. QuerySet API 이해 및 연습하기

자 우선 실습 환경을 구축하쟙

1. conda 가상환경 세팅

conda create -n "CRUD_1" python=3.8

conda activate CRUD_1

우선 작업을 시작하기 위해 conda 가상환경을 세팅 & 활성화해주자!

2. project에 필요한 Python Package 설치

pip install django
pip install mysqlclient

dJango, mysql 또한 설치해주기!
(mysqlclient는 이후에 mysql server에 접속하기 위한 package라고 한다)

3. dJango project & application 생성


이전에 mysite / polls 관리자 사이트를 생성하면서 대략 잡았었던 project & application 개념을 생각해보자.
우선 startproject라는 명령어를 통해 디렉토리 & 프로젝트를 생성했었고
기능 구현을 위해 startapp 명령어로 어플리케이션을 생성했었다.

westartucks라는 프로젝트를 생성하고, 그 안에 products라는 app을 생성해주기!

처음엔 엄청 헷갈렸었는데.. 이젠 좀 잡히는 느낌
더 많이 실습 해보면 좀더 잘 잡히겠지
빠이링..!!

4. Database 생성

create database westarbucks character set utf8mb4 collate utf8mb4_general_ci;

show databases;
use westarbucks;

데이터베이스명에 큰따옴표를 붙였더니 내내 syntax 에러가 났다.
왜..? 지금까지는 항상 넣었던거 같은데..
mysql 너 정말..


무튼 요로케 👆🏻👆🏻👆🏻 생성된 데이터베이스들을 확인할 수 있다.
westarbucks 데이터베이스를 사용하겠다고 선택한 뒤

이제 테이블들을 생성할 model을 생성하러 가보쟈!

5. settings.py 설정

conda 가상환경에 생성해둔 westudy 프로젝트 내 settings.py 파일을 수정해줘야 한다!

수정 항목

  • ip 허용
ALLOWED_HOSTS = ['*']
  • 주석처리
    : admin, auth, csrf, 등 주석처리! (사용하지 않는 요쇼들이므로)
    : INSTALLED APPS에 새로 생성된 앱인 products를 추가해주어야
    dJango에서 우리가 새로 작성하고있는 앱을 인식할 수 있다.

    : westarbucks/urls.py도 수정해주기!! 👈🏻👈🏻 중요하다고 한다
from django.urls import path
-
urlpatterns = [
]
  • MySQL database와 연동
    : dJango는 기본적으로 sqlite3와 연동이 되어있는데,
    이걸 내가 사용하기로 한 mysql 데이터베이스와 연동해줘야 쓸 수 있겠지!
DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE 명',
        'USER': 'root',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

👆🏻 요로케 필요한 항목들 적어주기!

6. products/models.py 작성

  • 아까 생성해둔 products app 내 models 수정해주기!
from django.db import models


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


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


class Product(models.Model):
		name  = models.CharField(max_length=100)
		price = models.IntegerField()
		menu = models.ForeignKey('Category', on_delete=models.CASCADE)

👆🏻 이런식으로 수정 꼬!

7. models.py migration 하기

manage.py 파일로 우리가 작성한 products 앱 makemigrations를 실행한 결과
👇🏻👇🏻 0001_initial.py에 내가 model.py에 작성해둔 테이블들 관련 모델이 생성되었다고 뜬다

하지만 아직은 실제 테이블들이 생성된 것은 아닌 상태!
데이터베이스에서 show tables; 쿼리를 입력해도 Empty set이라고 나온다.

이제 database에 진짜 table 생성을 하기 위해 migrate를 진행하면
👇🏻👇🏻 요로케 테이블들이 생성되어있는 것을 알 수 있다!

👇🏻 showmigrations를 사용하면 내가 실행한 migrate가 잘 적용되었는지 확인할 수 있다.
X 표시가 반영되었다는 뜻!

ORM이라는 파이썬의 라이브러리 덕택에 파이썬 코드database의 table이 될 수 있는 것!

Object-relational Mappers (ORMs)

An object-relational mapper (ORM) is a code library that automates the transfer of data stored in relational database tables into objects that are more commonly used in application code.

8. QuerySet 작성하기

우리가 지금까지 models.py에 작성한 것은 테이블의 컬럼 및 기본 속성!
이제 테이블 내 데이터들을 채워 줄 차례이다

dJango shell을 통해서 대화형식으로 DB와 소통이 가능한데,

> python manage.py shell

👆🏻 코드를 입력하면 DB와 직접 대화할 수 있는 shell창이 열린다.
manage.py는 dJango에게 최상위 폴더로 인식되기 때문에, 내가 사용하고자 하는 폴더 내 파일의 클래스(테이블)를 import 해주어야 한다.

변수에 담아서 데이터 확인하기

> menu = Menu.objects.get(컬럼 = "")
> menu.컬럼

CREATE

  • create(), save(), bult_create() 등 사용!
  • FK 참조하고 있는 경우, FK의 값을 변수에 담아서 create 해주기!
> Menu.objects.create(컬럼 = "")
-
a3 = Menu(name="상품")
>> a3.save()
-
> c1 = Category(name='콜드브루', menu_id=1)
> c2 = Category(name='에스프레소', menu_id=1)
> Category.objects.bulk_create([c1, c2])

READ

  • get(), all(), filter(), exclude(), values(), values_list(), count() 메서드와 필드 사용!
> Menu.objects.get(name="음료")
> AllergyDrink.objects.all().values()
> Allergy.objects.get(id=2).id)

번외

컬럼 엄청 많이 입력해야해서 짜증났을 때... 컬럼만 출력할 수 있는 쿼리!!

select COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_SCHEMA='westarbucks' 
and TABLE_NAME = 'products_nutritions';
+------------------+
| COLUMN_NAME      |
+------------------+
| id               |
| one_serving_kcal |
| sodium_mg        |
| saturated_fat_g  |
| sugars_g         |
| protein_g        |
| caffeine_mg      |
| size_ml          |
| size_fluid_ounce |
| drinks_id        |
+------------------+
10 rows in set (0.00 sec)

데이터타입별 models.py 사용 코드

후하 오타때문에 엄청 삽질했다.

  • VARCHAR
name = models.CharField(max_length=20)
  • INTEGER
int = models.IntegerField()
  • DECIMAL
one_serving_kcal = models.DecimalField(max_digits=10, decimal_places=2)
  • ForeignKey
menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

Decimal 타입일 때 default 값 주는 방법은 검색을 했는데도 모르겠다..
default = Decimal(0.00) 이렇게 주니까 자꾸 에러나서 결국 참고했던 페이지 👇🏻
Decimal Field_dJango

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글