์ง๋์๊ฐ์๋ ์ฅ๊ณ ๋ผ๋ ๊ฐ๋ ์ ์ฒ์ ๋ฐฐ์ ๋๋ฐ,
์ฅ๊ณ ์ ํฐ๊ฐ๋ ์ค ํ๋์ธ CRUD๋ฅผ ๋ฐฐ์ฐ๊ณ ์ค์ตํด๋ณด์!๐
ํ๋ก ํธ์ค๋๊ฐ ํ์ํ ์๋ฃ๋ฅผ ์ฐ๋ฆฌ๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ ๋ณด๋ด์ค๋ค.
1.์น๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ์๊ฐ ์ด ํ๋ฉด์ ๋ณด๊ณ ์๋ค๊ฐ, ์ฒ์ ์ํ์ ํด๋ฆญ
๋ฐฑ์๋๋ก ์์ฒญ(web application server)->ํ์ํ ์ ๋ณด ์์ฒญ(database)
database ์์์์ฒญ๋ฐ์ ๋๋ก ์ ๋ณด๋ค์ ์๋ตํ๋ค(์๋ ๋ฅด๊ธฐ, ์์, ์ ๋ณด๋ฑ๋ฑ)->web applicaition server๊ฐ ์์ธ์ ๋ณด๋ฅผ ์๋ตํ๋ค.->ํ๋ฉด ๊ฒฐ๊ณผ ์ถ๋ ฅ
์ด๊ฒฝ์ฐ ์ฅ๊ณ ๋ ๋ฌด์จ์ญํ ์ ํ ๊น?
์ฅ๊ณ ๋ ์์ ์ด๋ฏธ์ง์ค ์ฃผํฉ์ ๋ถ๋ถ์ ๋ด๋นํ๋ค
์น์๋ฒ๋ก ๋ค์ด์ค๋ฉด
URLconf๋ก ์ฒ์ ์์ฒญ์ด ๋ค์ด๊ฐ๊ฒ ๋๊ณ , URKconf๋ ์ด๋ฅผ view๋ก ๋ณด๋ธ๋ค
๊ทธ๋ผ view๋ ์ค์ ๋ก ์์ฒญ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ Model ์๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ๋ data๋ฅผ ๊ฐ์ ธ์ค๋ผ๊ณ ๋ช
๋ นํจ ์ด๋ ORM์ด๋ผ๋ ์์คํ
์ ํตํด์ database์์ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค
์ด ๋จ๊ณ๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ด๋ฒ์ ์ฒ์์ผ๋ก ํ๋๊ฒ! ๋ชจ๋ธ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํต์ ์ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์์ฑ ์กฐํ ์์ ์ญ์ ํด๋ณธ๋ค
(์ด๊ฑธ ์ํด์ผ ์๋ 2๋ฒ์ ์ ํ ์ ์๋ค!)
์ฐ๋ฆฌ๋ ํด๋ผ์ด์ธํธ ์๋น์ค๋ฅผ ์ด์ฉํด์ url, view๋ฅผ ์ง ๊ฒ ์ ๋๋์ง ํ์ธํด๋ณธ๋ค.
view๋ฅผ ๊น๋ํ๊ณ ํจ์จ์ ์ผ๋ก ์ฑ๋ฅ ์ข๊ฒ ์ง๊ธฐ์ํด 1๋ฒ์ ์๋ฒฝํ๊ฒ ์ต์ํด์ ธ์ผ ํ๋ค.(์์ง์ ์ชผ๋ ์ด๋๊น ์ด์ ๋๋ก ๋)
Object-relational mapping์ ์ถ์ฝ์ด๋ก ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํ(์ฐ๊ฒฐ)ํด์ฃผ๋ ๊ฒ์ ๋งํ๋ค.๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ , ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ชจ๋ธ ๊ฐ์ ๋ถ์ผ์น๊ฐ ์กด์ฌํ๋๋ฐ ORM์ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑํ์ฌ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ <โ๋งคํโ> Object ํ๋
๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค.
C.R.U.D๋ ์ด ORM์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ง์ง๊ณ ๋ณถ๋(?)๊ณผ์ ์ ๋งํ๋ค.
ORM์ฌ์ฉํด์ Python code๋ก Datebase์์ฑํ๋ค.[Model]์์ ์ ๋ณด๋ฅผ ์ ๋ ฅํด์ ์ด๊ฑธ ์๋์ผ๋ก MySQL์ ํ ์ด๋ธ๋ก ์ ๋ ฅํ๊ฒ ํ๋๊ฑธ ๋งํ๋ค.
(ใ
ใ
์ด๊ฒ๋งํผ ์ฐฐ๋ก์ธ ์์๊ฐ ์๋ค..ใ
ใ
)
์ฐ๋ฆฌ๋ ํ์ด์ฌ์ด๋ผ๋ ์ธ์ด๋ก Model์ Person
๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค. ์ด๊ฑธ ์ฅ๊ณ ๊ฐ ORM์ ํตํด ์๋์ผ๋ก ๋ฃ์ด์ค๋ค!
Read์์ ์ ์ฉ๋๋ ํจ์์ค filterํจ์์ ์ผ๋ฐํ์ด์ฌ์์์ list์ ๋์ผ
get์ ์กฐ๊ฑด ์ฌ๋ฌ๊ฐ์ง ์์ด๋ ๊ณ ์ ํ ํ๋์ ์ธ์คํด์ค๋ง ๊ฐ์ ธ์จ๋ค(๋ง์ผ ๊ฒฐ๊ณผ๊ฐ์ด ์ค๋ณต๋๋๊ฒ ์์ด๋ ์ค๋ฅ๊ฐ ๋๋ค)
๋ณ๊ฒฝ์ฌํญ ํ์ธ์->Mysql์์ ๋ณด๋์ง, filter์ ํตํด์ ๋ณด๋๊ฒ๋ ๊ฐ๋ฅํ๋ค
id=1์ ์ญ์ ๋ฅผ ํ๋ฉด ๋น์นธ์ด ๋จ๋๋ฐ, ์๋ก ๋ฐ์ดํฐ๋ฅผ Updateํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? -> ๋น์นธ์ ๋ค์ด๊ฐ๋๊ฒ ์๋ ์์ ์๋กญ๊ฒ ์ถ๊ฐ ๋๋ค!
query
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์์ฒญํด์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค. ํ์ด์ฌ์ผ๋ก ์์ฑํ ์ฝ๋๊ฐ sql ๋ก ๋งคํ๋์ด ๊ฐ์ด ๋์ด์ค๋๋ฐ, ์ด๋ queryset
์ด๋ผ๋ ์๋ฃํํ๋ก ๊ฐ์ด ๋์ด์ค๊ฒ ๋๋ค.
์ถ์์ ์ธ ๊ฐ๋
์ด๋ผ ์์ง ์ ์๋ฟ๋ ๊ฐ๋
์ ์๋๋ฐ ์ฝ๊ฒ ์๊ฐํ๋ฉด ์ ๋ฌ๋ฐ์ ๋ชจ๋ธ์ ๊ฐ์ฒด ๋ชฉ๋ก์ ๋งํ๋๊ฒ์ด๋ค.
AqueryTools ์ฐธ๊ณ ํด์ models.py ์์ฑ ํ MySQL database์ table ์์ฑํ๊ธฐ
์ผ๋จ ๋ด ์ปดํจํฐ์ ๊ฐ์ํ๊ฒฝ์ ๊ตฌํํด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์ค์นํ๋ค(๋๋ miniconda๋ฅผ ์ค์นํ๋ค
westarbucks
๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ํจ)#ํ์ด์ฌ๋ฒ์ ์ ๊ฐ์ํ๊ฒฝ์! ๋ฒ์ ๋ฐ๋ผ ๋ฌ๋ผ์~
conda create -n westarbucks python=3.8
conda activate westarbucks
pip install django
pip install mysqlclient
์ฐ๋ฆฌ๊ฐ ํ๊ฑด ๊ฐ์ํ๊ฒฝ์ด์๋ค. ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ์ฑ๋ ๊ฐ์ด ๋ง๋ค์ด๋ณด์
westarbucks
๋ผ๋ ์ด๋ฆ์ ํ๋ก์ ํธ ์์ฑ#westarbucks ํ๋ก์ ํธ ์์ฑ
django-admin startproject westarbucks
products
๋ผ๋ ์ด๋ฆ์ ์ฑ์ ์์ฑ#ํ๋ก์ ํธ ์์ผ๋ก ๋ค์ด๊ฐ
cd westarbucks
#product๋ฅผ ๋ง๋ค์
python manage.py startapp products
์ฐ๋ฆฌ๊ฐ 1),2)์์ ํ๊ฑด ํฐ๋ฏธ๋์ ์
ํ
์ด์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์ง ์๋ฌด๊ฒ๋ ๋ง๋ค์ด์ง๊ฒ ์์ผ๋, ํ๋ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์
์ด๋ฆ์ ๋ด๋ง๋๋ก westar
๋ผ๊ณ ์ ํ๋ค ใ
ใ
#mysql์ ์ด์ด์ฃผ์
mysql.server start
mysql -u root -p
#mysql์์
create database westar character set utf8mb4 collate utf8mb4_general_ci;
๊ฒฝ๋ก๊ฐ ๋งค๋ฒ ํท๊ฐ๋ ค์ ใ ใ ์์ํ์ผ์ ๋ค ํ์ํ๋๊ฑธ๋ก..
(์ด๊ฑฐ ํ๋ ค์ ๋ช์๊ฐ์ ๋ ๋ ธ๋ ๊ธฐ์ต์ด์๋ค...
๋ด๋จธ๋ฆฌ๋ฅผ ๋ฏฟ์ง๋ง๊ณ ๊ทธ๋ฅ ์ด๋๋ค ์ ๋์ง, ์ฌ์ง์ ์ฐ์ด๋๋์ง ํ์..)
๊ทธ๋๊ทธ๋ ๋ค๋ฅด๋ฏ๋ก ๊ฐ๋ตํ๊ฒ๋ง ์ ๊ฒ ๋ค
'*'
๋ก ํด์ค๋ค#
์ผ๋ก ์ฃผ์์ฒ๋ฆฌํด์ค๋คDATABASES
ํญ๋ชฉ์ ์์ ํด์ค๋ค์๋์ ๊ฐ์ด ์์ ํด์ค๋ค
from django.urls import path
urlpatterns = [
]
์ด๊ฑฐ ์ง์ง ์ ์ผ ์ค์
์ฌ๊ธฐ์ ์์ฑํ class๋ค์ ๊ธฐ์ค์ผ๋ก db์ ํ
์ด๋ธ์ด ์์ฑ๋๋ค.
๊ทธ๋ฆฌ๊ณ class์์ ๋ณ์๋ค์ด db์ column์ด ๋๋ค๊ณ ์๊ฐํ๊ณ ์ ๊ทผํด๋ณด์
vi models.py
๊ทธ๋ฆฌ๊ณ ๊ฐ ํ ์ด๋ธ๋ค์ ๋ง๋ class๋ฅผ ์์ฑํด์ค๋ค.
from django.db import models
# ๊ฐ ๋ฉ๋ด๋ค์ ๋ง๋ ์ค์ ๊ฐ์ ์
๋ ฅํด์ฃผ์
class Menu(models.Model):
name = models.CharField(max_length=20)
#์นดํ
๊ณ ๋ฆฌ์ ๊ฒฝ์ฐ menu_id๊ฐ ์๋๋ฐ, ์ด๊ฒ ์์์ ๋ง๋ Menu๋ฅผ Foreign Key๋ก ์ฐธ์กฐํ๊ณ ์์ผ๋ ์ฃผ์ํ์!
class Categories(models.Model):
name = models.CharField(max_length=20)
menu = models.ForeignKey('Menu',on_delete=models.CASCADE)
#์๋ฃ ๋ฉ๋ด๋ ๋ค๋ฅธ ํ
์ด๋ธ์์ ์ฐธ์กฐ~!!
class Drinks(models.Model):
category = models.ForeignKey('Categories', on_delete=models.CASCADE)
korean_name = models.CharField(max_length=30)
english_name = models.CharField(max_length=30)
description = models.TextField()
class Images(models.Model):
image_url = models.CharField(max_length=500)
drink = models.ForeignKey('Drinks',on_delete=models.CASCADE)
class Allergy_drink(models.Model):
allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
drink = models.ForeignKey('Drinks', on_delete=models.CASCADE)
class Allergy(models.Model):
name = models.CharField(max_length=20)
class Nutritions(models.Model):
one_serving_kcal = models.DecimalField(max_digits = 5, decimal_places = 2)
sodiumn_mg = models.DecimalField(max_digits = 5, decimal_places = 2)
saturated_fat_g = models.DecimalField(max_digits = 10, 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('Drinks',on_delete=models.CASCADE)
size_ml = models.CharField(max_length=20)
size_fluid_ounce = models.CharField(max_length=20)
#Decimal Field : ๊ณ ์ ์์ซ์ ์ ๊ฐ์ง๋ ํ๋๋ก ์ ํํ ์ซ์๋ฅผ ์ ์ฅํ๋ค. 2๊ฐ์ ํ์ option์ด ์กด
#1.max_digits : ์ซ์์ ํ์ฉ๋๋ ์ต๋ ์๋ฆฟ์. 2.decimal_placesใ
:์ซ์์ ํจ๊ป ์ ์ฅํ๋ ์์ ์๋ฆฟ์์ ๊ฐ์
๋ง์ด๊ทธ๋ ์ด์ (migration)์ด๋?
๋ชจ๋ธ์ ๋ํ ๋ณ๊ฒฝ์ฌํญ๋ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง์ ์ ๋ฌํ๋ Django์ ๋ฐฉ๋ฒ์ด๋ค.
-makemigrations : ๋ชจ๋ธ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ฑํ๋ ์ญํ (์ด์์์ฑ)
-migrate : ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฉ or ์ ์ฉ์ทจ์์ ์ฌ์ฉ
-sqlmigrate : ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํ SQL๋ฌธ์ ํ์
-showmigrations : ํ๋ก์ ํธ์ ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ ์ํ๋ฅผ ๋์ด
์ค์ DB์๋ sql์ฟผ๋ฆฌ๋ก ๋ช ๋ น์ด ์ ๋ฌ๋๊ธฐ๋๋ฌธ์ migrationํ์ผ์ ์ฟผ๋ฆฌ๋ ์๋์ง๋งsqlmigrate
๋ก sql๋ก ํ์ธํ๋ ์ต๊ด์ ๋ค์ด๋๊ฒ ์ข๋ค.
*์ฃผ์ ์ด๋ฏธ ์ ์ฉํ migrateionํ์ผ์ ์ ๋๋ก ์ง์ฐ๋ฉด ์๋จ(ํผ๋์ด์ผ์ด๋์ DB,models๋ค ๋ค์ํด์ผํ๋ ๋ถ์์ฌ๊ฐ..ใ ใ ๐ญ)
(๋๋ models.py์ ๋ด์ฉ์ด db์ ์ฐ๋์ด ๋๋๊น, ์ด๊ฑธ db์ ๋ณ๊ฒฝ์ฌํญ์ ์๋ ค์ฃผ๋๊ฑธ migrate๋ผ๊ณ ์ดํดํ๋ค)
์ฐ๋ฆฌ๋ ์์ prodcucts/models.py์์ class๋ฅผ ์ ๋ ฅํ๋ค. ์ด๊ฑธ manage.py๊ฐ ์๋ ํด๋๋ก ๊ฐ์ makemigrations/migrate๋ฅผ ํด์ฃผ์!
#app์ด๋ฆ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค
python manage.py makemigrations products
#makemigrations์์ ์๋ฌ๊ฐ ์๋จ๋ฉด ๋ฐ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋จ!
python manage.py migrate prodcuts
๋ญ ์ด๋ป๊ฒ ๋ฃ์ด? ๋ผ๊ณ ์๊ฐํ์ง๋ง
manage.py์์ python shell๋ก ์ ์ํ ๊ฑฐ๋ค.
์ด๋ถ๋ถ์ ์ ๋ง ํท๊ฐ๋ ค์ใ
..๊ณ ์์ํ๋ค
ls
๋ช
๋ น์ด๋ฅผ ์ณ์manage.py
๊ฐ ์๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ
python manage.py shell
์ ์ณ์ฃผ๋ฉด python์๋ก ์ด๋ํ๋ค.
(bash),์ฆ ๊ฐ์ํ๊ฒฝ์ค์ ์ ์ํ ์ํ๋ก ๋ค์ด๊ฐ๋ฉด ๊ณ์ ์๋ฌ๊ฐ๋๋๋ผ
~์๋? ๊ฐ์ํ๊ฒฝ์ด๋ ๋ด ๋ฐ์คํฌํ์ด๋ ๊น๋ฆฐ ํจํค์ง๊ฐ ๋ค๋ฅด๊ฑฐ๋~(๊ฐ์ผ๋ฉด ๋ฌธ์ ์์ต๋๋ค..Maybe)
models.py์์ ์ ๋ ฅํ class๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
#models.py์์ class๋ฅผ ๊ฐ์ ธ์ค์
from products.models import Menu,Category
#Menu์ '๋ฉ๋ด'์์ฑ
Menu.objecy.create(name="์๋ฃ")
#Category์ '์ฝ๋ ๋ธ๋ฃจ ์ปคํผ'์์ฑ
#์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ Foreign Key๊ฐ ์๋ค๋๊ฑฐ!
Categories.objects.create(name = "์ฝ๋ ๋ธ๋ฃจ ์ปคํผ", menu=Menu.objects.get(name = "์๋ฃ")
# a1 = Menu.objects.get(name = "์๋ฃ")๋ผ๊ณ ํด์ ๋ณ์a1์ ๋ฃ์ด์ฃผ๋๊ฒ ํธํ๋ ๊ทธ๋ ๊ฒ ์จ๋๋จ
๋ค์ฐ๋ฉด ๊ธธ์ด์ง๋ ์ด๋ฐ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋๊ทธ๋ ๋ฐ์์ด ์ ๋์๋์ง๋ฅผ MySQL์์ ํ์ธํ๋ฉด ๋๋ค
>>> SELECT * FROM "ํ
์ด๋ธ์ด๋ฆ";
์ด๋ฐ์์ผ๋ก ๊น๋ํ๊ฒ ์ ๋ค์ด๊ฐ๋ค!!