[๐Ÿค Django] C.R.U.D (1)

์—ฌ์ฃผ๋งยท2020๋…„ 12์›” 6์ผ
0

Django

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

์ง€๋‚œ์‹œ๊ฐ„์—๋Š” ์žฅ๊ณ ๋ผ๋Š” ๊ฐœ๋…์„ ์ฒ˜์Œ ๋ฐฐ์› ๋Š”๋ฐ,
์žฅ๊ณ ์˜ ํฐ๊ฐœ๋…์ค‘ ํ•˜๋‚˜์ธ CRUD๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‹ค์Šตํ•ด๋ณด์ž!๐Ÿ‘

<์žฅ๊ณ ๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”๊ฑด์ง€ ํ•œ๋ฒˆ ๋ณด์ž(์›น๊ฐœ๋ฐœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ)>

ํ”„๋ก ํŠธ์•ค๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ž๋ฃŒ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ๋ณด๋‚ด์ค€๋‹ค.

1.์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํ™”๋ฉด์„ ๋ณด๊ณ  ์žˆ๋‹ค๊ฐ€, ์ฒ˜์Œ ์ƒํ’ˆ์„ ํด๋ฆญ
๋ฐฑ์—”๋“œ๋กœ ์š”์ฒญ(web application server)->ํ•„์š”ํ•œ ์ •๋ณด ์š”์ฒญ(database)
database ์—์„œ์š”์ฒญ๋ฐ›์€ ๋Œ€๋กœ ์ •๋ณด๋“ค์„ ์‘๋‹ตํ•œ๋‹ค(์•Œ๋ ˆ๋ฅด๊ธฐ, ์˜์–‘, ์ •๋ณด๋“ฑ๋“ฑ)->web applicaition server๊ฐ€ ์ƒ์„ธ์ •๋ณด๋ฅผ ์‘๋‹ตํ•œ๋‹ค.->ํ™”๋ฉด ๊ฒฐ๊ณผ ์ถœ๋ ฅ

์ด๊ฒฝ์šฐ ์žฅ๊ณ ๋Š” ๋ฌด์Šจ์—ญํ• ์„ ํ• ๊นŒ?


์žฅ๊ณ ๋Š” ์œ„์˜ ์ด๋ฏธ์ง€์ค‘ ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•œ๋‹ค

<์žฅ๊ณ ์—์„œ ํ•ต์‹ฌ 2๊ฐ€์ง€>

1. ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ


์›น์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋ฉด
URLconf๋กœ ์ฒ˜์Œ ์š”์ฒญ์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , URKconf๋Š” ์ด๋ฅผ view๋กœ ๋ณด๋‚ธ๋‹ค

๊ทธ๋Ÿผ view๋Š” ์‹ค์ œ๋กœ ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” Model ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์›ํ•˜๋Š” data๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๊ณ  ๋ช…๋ นํ•จ ์ด๋•Œ ORM์ด๋ผ๋Š” ์‹œ์Šคํ…œ์„ ํ†ตํ•ด์„œ database์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

์ด ๋‹จ๊ณ„๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฒˆ์— ์ฒ˜์Œ์œผ๋กœ ํ•˜๋Š”๊ฒƒ! ๋ชจ๋ธ์ด๋ž‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž‘ ํ†ต์‹ ์„ ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ ์กฐํšŒ ์ˆ˜์ • ์‚ญ์ œ ํ•ด๋ณธ๋‹ค
(์ด๊ฑธ ์ž˜ํ•ด์•ผ ์•„๋ž˜ 2๋ฒˆ์„ ์ž˜ ํ•  ์ˆ˜ ์žˆ๋‹ค!)

2. ํด๋ผ์ด์–ธํŠธ ์„œ๋น„์Šค

์šฐ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด์„œ url, view๋ฅผ ์ง ๊ฒŒ ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.
view๋ฅผ ๊น”๋”ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์„ฑ๋Šฅ ์ข‹๊ฒŒ ์งœ๊ธฐ์œ„ํ•ด 1๋ฒˆ์— ์™„๋ฒฝํ•˜๊ฒŒ ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•œ๋‹ค.(์•„์ง์€ ์ชผ๋ ™์ด๋‹ˆ๊นŒ ์ด์ •๋„๋กœ ๋)

<ORM ๊ทธ๋ฆฌ๊ณ  Data๊ด€๋ฆฌ์˜ˆ์ œ(C.R.U.D)>

ORM์ด๋ž€

Object-relational mapping์˜ ์ถ•์•ฝ์–ด๋กœ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.
๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ <โ€”๋งคํ•‘โ€”> Object ํ•„๋“œ
๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

C.R.U.D๋ž€ ์ด ORM์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ง€๊ณ ๋ณถ๋Š”(?)๊ณผ์ •์„ ๋งํ•œ๋‹ค.

  • Create/Read/Update/Delete์˜ ์ถ•์•ฝ

Create

ORM์‚ฌ์šฉํ•ด์„œ Python code๋กœ Datebase์ƒ์„ฑํ•œ๋‹ค.[Model]์—์„œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์„œ ์ด๊ฑธ ์ž๋™์œผ๋กœ MySQL์— ํ…Œ์ด๋ธ”๋กœ ์ž…๋ ฅํ•˜๊ฒŒ ํ•˜๋Š”๊ฑธ ๋งํ•œ๋‹ค.

(ใ…œใ…œ ์ด๊ฒƒ๋งŒํผ ์ฐฐ๋–ก์ธ ์˜ˆ์‹œ๊ฐ€ ์—†๋‹ค..ใ…œใ…œ)
์šฐ๋ฆฌ๋Š” ํŒŒ์ด์ฌ์ด๋ผ๋Š” ์–ธ์–ด๋กœ Model์— Person๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๊ฑธ ์žฅ๊ณ ๊ฐ€ ORM์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค!

  • objects๋ผ๋Š”๊ฑด Manager class๋กœ ์žฅ๊ณ ์—์„œ ์“ฐ๋Š”๊ฒƒ!!(์ผ๋ฐ˜ ํŒŒ์ด์ฌ์—์„œ ์“ฐ๋ฉด ์—๋Ÿฌ๋œน๋‹ˆ๋‹ค~~)

Read

Read์—์„œ ์ ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ค‘ filterํ•จ์ˆ˜์€ ์ผ๋ฐ˜ํŒŒ์ด์ฌ์—์„œ์˜ list์™€ ๋™์ผ
get์€ ์กฐ๊ฑด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ์–ด๋„ ๊ณ ์œ ํ•œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค(๋งŒ์ผ ๊ฒฐ๊ณผ๊ฐ’์ด ์ค‘๋ณต๋˜๋Š”๊ฒŒ ์žˆ์–ด๋„ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค)

Update

๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ์€->Mysql์—์„œ ๋ณด๋˜์ง€, filter์„ ํ†ตํ•ด์„œ ๋ณด๋Š”๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

Delete

id=1์— ์‚ญ์ œ๋ฅผ ํ•˜๋ฉด ๋นˆ์นธ์ด ๋‚จ๋Š”๋ฐ, ์ƒˆ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ Updateํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? -> ๋นˆ์นธ์— ๋“ค์–ด๊ฐ€๋Š”๊ฒŒ ์•„๋‹Œ ์•„์˜ˆ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ ๋œ๋‹ค!

์ฟผ๋ฆฌ์…‹ (Queryset)

query๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ •๋ณด๋ฅผ ์š”์ฒญํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ sql ๋กœ ๋งคํ•‘๋˜์–ด ๊ฐ’์ด ๋„˜์–ด์˜ค๋Š”๋ฐ, ์ด๋•Œ queryset์ด๋ผ๋Š” ์ž๋ฃŒํ˜•ํƒœ๋กœ ๊ฐ’์ด ๋„˜์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
์ถ”์ƒ์ ์ธ ๊ฐœ๋…์ด๋ผ ์•„์ง ์ž˜ ์™€๋‹ฟ๋Š” ๊ฐœ๋…์€ ์•„๋‹Œ๋ฐ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์ „๋‹ฌ๋ฐ›์€ ๋ชจ๋ธ์˜ ๊ฐ์ฒด ๋ชฉ๋ก์„ ๋งํ•˜๋Š”๊ฒƒ์ด๋‹ค.

<์‹ค์ „์—ฐ์Šต>

AqueryTools ์ฐธ๊ณ ํ•ด์„œ models.py ์ž‘์„ฑ ํ›„ MySQL database์— table ์ƒ์„ฑํ•˜๊ธฐ

1. ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์„ค์ •ํ•˜๊ธฐ

1)๊ฐ€์ƒํ™˜๊ฒฝ ์…‹ํŒ…ํ•˜๊ธฐ

์ผ๋‹จ ๋‚ด ์ปดํ“จํ„ฐ์— ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๊ตฌํ˜„ํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•œ๋‹ค(๋‚˜๋Š” miniconda๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค

  • ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋จผ์ € ๋งŒ๋“ค์ž(westarbucks๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ •ํ•จ)
#ํŒŒ์ด์ฌ๋ฒ„์ „์˜ ๊ฐ€์ƒํ™˜๊ฒฝ์ž„! ๋ฒ„์ „๋”ฐ๋ผ ๋‹ฌ๋ผ์š”~
conda create -n westarbucks python=3.8
  • ๊ฐ€์ƒํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”์‹œํ‚ค์ž
conda activate westarbucks
  • ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์ผ๋‹จ ์•ˆ์—๋Š” ํ……ํ…… ๋น„์–ด์žˆ์œผ๋‹ˆ, ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ์„ค์น˜ํ•˜์ž(์ด๋ฒˆ์— ํ• ๊ฑด MySQL๊ณผ Django~)$ pip install django
pip install django
pip install mysqlclient

2)Django project&application์„ ๋งŒ๋“ค์ž

์šฐ๋ฆฌ๊ฐ€ ํ•œ๊ฑด ๊ฐ€์ƒํ™˜๊ฒฝ์ด์˜€๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— ์•ฑ๋„ ๊ฐ™์ด ๋งŒ๋“ค์–ด๋ณด์ž

  • westarbucks๋ผ๋Š” ์ด๋ฆ„์˜ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
#westarbucks ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
django-admin startproject westarbucks
  • products๋ผ๋Š” ์ด๋ฆ„์˜ ์•ฑ์„ ์ƒ์„ฑ
#ํ”„๋กœ์ ํŠธ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€
cd westarbucks

#product๋ฅผ ๋งŒ๋“ค์ž
python manage.py startapp products

3)Database๋„ ์ƒ์„ฑํ•˜์ž(MySQL์—์„œ ํ•จ)

์šฐ๋ฆฌ๊ฐ€ 1),2)์—์„œ ํ•œ๊ฑด ํ„ฐ๋ฏธ๋„์˜ ์…‹ํŒ…์ด์˜€๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ ์•„์ง ์•„๋ฌด๊ฒƒ๋„ ๋งŒ๋“ค์–ด์ง„๊ฒŒ ์—†์œผ๋‹ˆ, ํ•˜๋‚˜ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์ž
์ด๋ฆ„์€ ๋‚ด๋ง˜๋Œ€๋กœ westar๋ผ๊ณ  ์ •ํ–ˆ๋‹ค ใ…Žใ…Ž

#mysql์„ ์—ด์–ด์ฃผ์ž
mysql.server start
mysql -u root -p

#mysql์—์„œ 
create database westar character set utf8mb4 collate utf8mb4_general_ci;

2. project,application ์…‹ํŒ…ํ•˜๊ธฐ

๊ฒฝ๋กœ๊ฐ€ ๋งค๋ฒˆ ํ—ท๊ฐˆ๋ ค์„œ ใ… ใ…  ์ƒ์œ„ํŒŒ์ผ์„ ๋‹ค ํ‘œ์‹œํ•˜๋Š”๊ฑธ๋กœ..
(์ด๊ฑฐ ํ‹€๋ ค์„œ ๋ช‡์‹œ๊ฐ„์„ ๋‚ ๋ ธ๋˜ ๊ธฐ์–ต์ด์žˆ๋‹ค...
๋‚ด๋จธ๋ฆฌ๋ฅผ ๋ฏฟ์ง€๋ง๊ณ  ๊ทธ๋ƒฅ ์–ด๋””๋‹ค ์ ๋˜์ง€, ์‚ฌ์ง„์„ ์ฐ์–ด๋‘๋˜์ง€ ํ•˜์ž..)

1)westarbucks/settings.py์„ค์ •

๊ทธ๋•Œ๊ทธ๋•Œ ๋‹ค๋ฅด๋ฏ€๋กœ ๊ฐ„๋žตํ•˜๊ฒŒ๋งŒ ์ ๊ฒ ๋‹ค

  • IPํ—ˆ์šฉ : ALLOWED_HOSTS๋ฅผ '*'๋กœ ํ•ด์ค€๋‹ค
  • ์‚ฌ์šฉํ•˜์ง€์•Š๋Š” ์š”์†Œ๋“ค๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ #์œผ๋กœ ์ฃผ์„์ฒ˜๋ฆฌํ•ด์ค€๋‹ค
  • MySQL database์™€ ์—ฐ๋™์„ ์œ„ํ•ด ๋‚ด๋ถ€ DATABASESํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•ด์ค€๋‹ค

2)westarbucks/urls.py์„ค์ •

์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ค€๋‹ค

from django.urls import path

urlpatterns = [
]

3)products/models.py ์…‹ํŒ…

์ด๊ฑฐ ์ง„์งœ ์ œ์ผ ์ค‘์š”
์—ฌ๊ธฐ์„œ ์ž‘์„ฑํ•œ class๋“ค์„ ๊ธฐ์ค€์œผ๋กœ db์— ํ…Œ์ด๋ธ”์ด ์ž‘์„ฑ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  class์•ˆ์˜ ๋ณ€์ˆ˜๋“ค์ด db์˜ column์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ ‘๊ทผํ•ด๋ณด์ž

  • models.py๋ฅผ ์—ด์–ด์ฃผ์ž
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ใ……:์ˆซ์ž์™€ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š” ์†Œ์ˆ˜ ์ž๋ฆฟ์ˆ˜์˜ ๊ฐœ์ˆ˜

4)๋ณ€๋™๋œ ์‚ฌํ•ญ์„ makemigrations/migrate ํ•˜๊ธฐ!

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(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

3.๋ฐ์ดํ„ฐ ์ž…๋ ฅํ•˜๊ธฐ

๋ญ˜ ์–ด๋–ป๊ฒŒ ๋„ฃ์–ด? ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ
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 "ํ…Œ์ด๋ธ”์ด๋ฆ„";

4.๊ฒฐ๊ณผ


์ด๋Ÿฐ์‹์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ž˜ ๋“ค์–ด๊ฐ”๋‹ค!!

profile
๐ŸŒฑBackend Developer๐Ÿ‘ฉโ€๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€