Django DB ๋ชจ๋ธ๋ง

Gom Laยท2023๋…„ 3์›” 30์ผ
0

์žฅ๊ณ ์™€ ์นœํ•ด์ง€๊ธฐ

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

๐Ÿ”– ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง์ด๋ž€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง์ด๋ž€ ์ผ์ƒ ์†์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค ์ค‘ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ์„ ๋ฐ์ดํ„ฐํ™” ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์†์„ฑ๋“ค์„ ์ •์˜ํ•˜๋ฉฐ Databaseํ™” ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด Jobs์ด๋ผ๋Š” Table์— ์ง์—…์˜ ์ •๋ณด๋ฅผ ๊ฐ ์†์„ฑ๋ณ„๋กœ ์ •์˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

  • ์ง์—…์ด๋ฆ„
  • ๋ถ„๋ฅ˜
  • ๊ทผ๋ฌด์ง€
  • ๋ณ€๊ฒฝ์ผ
  • ์ƒ์„ฑ์ผ

โžค Django ๋ชจ๋ธ๋ง

  • Django์—์„œ id๋Š” ๊ธฐ๋ณธ ๊ฐ’(Primary Key)์ •์˜ ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™ ์ •์˜
  • ์™ธ๋ž˜ํ‚ค(Foreign Key)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋’ค์— xxxx_id๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
  • Job์— ์œ„์น˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ ํ•˜๊ณ  ์‹ถ์€๋ฐ ํ•ด๋‹น ์œ„์น˜๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ๋‹ค๋ฉด location์œผ๋กœ ์ •์˜ํ•ด์ฃผ๋ฉด location_id๋กœ ๋ฐ์ดํ„ฐ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์ด ์ƒ์„ฑ๋จ

๐Ÿ”– Django ์นผ๋Ÿผํƒ€์ž…

โžค ๋ฌธ์ž์—ด

  • CharField(๊ธธ์ด๊ฐ€ ๊ณ ์ •์ ์ธ ๋ฌธ์ž์—ด)
  • TextField(๊ธธ์ด๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๋ฌธ์ž์—ด)

โžค ์ˆซ์ž

  • IntegerField(-2147483648~2147483647)
  • PositiveIntegerField
  • BigIntegerField(-9223372036854775808~9223372036854775807)
  • PositiveBigIntegerField

โžค ๋‚ ์งœ

  • DateField(๋‚ ์งœ)
  • DateTimeField(๋‚ ์งœ+์‹œ๊ฐ„)

โžค ๊ธฐํƒ€

  • BooleanField(True/False)
  • EmailField(์ด๋ฉ”์ผ ํฌ๋ฉง)
  • JSONField(Json ํฌ๋ฉง)
  • AutoField(Auto Increment ํ•„๋“œ with IntegerField)
  • BigAutoField(Auto Increment ํ•„๋“œ with BigIntegerField)

โžค ์™ธ๋ž˜ํ‚ค

  • ForeignKey(๋‹ค๋ฅธ ํ…Œ์ด๋ธ” PK ์ฐธ์กฐ ํ•„๋“œ)

์œ„์— ์–ธ๊ธ‰ํ•œ ํƒ€์ž…์™ธ์—๋„ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค๋„ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์นผ๋Ÿผ๋“ค๋งŒ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


๐Ÿ”– Django ๋ชจ๋ธ๋ง

๋จผ์ € ๋ชจ๋ธ๋ง์— ๋Œ€ํ•ด์„œ Django์—์„œ์˜ ๋ชจ๋ธ๋ง์€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ค ์ปฌ๋Ÿผ ํƒ€์ž…์ด ์žˆ๋Š”์ง€ ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด ๋ณด์ง€ ์•Š์œผ๋ฉด ์ •ํ™•ํžˆ ์™€๋‹ฟ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ Django๊ฐ•์˜๋“ค์„ ์‚ดํŽด๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„ ์ฒ˜์Œ ๋ชจ๋ธ๋ง์— ๋Œ€ํ•ด User๋ฅผ ๋งŽ์ด ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜์ง€๋Š” ๋‚˜๋Š” ๊ฒฐ์ œ๊ณ„ํš(PayPlan)์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋ธ๋ง์„ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ๋‹ค.

โžค APP ์ƒ์„ฑ

๋ชจ๋ธ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์•ˆ์— APP์ด ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด APP์— ์ž‘์„ฑ๋œ ๋ชจ๋ธ๋ง ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ Database์˜ ํ…Œ์ด๋ธ”๊ณผ ์นผ๋Ÿผ๋“ค์ด ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— APP์˜ ์ƒ์„ฑ์ด ์šฐ์„ ๋˜์–ด์•ผ ํ•œ๋‹ค.

# APP ์ƒ์„ฑ ๋ช…๋ น์–ด
django-admin startapp shortener

์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด 'shortener'๋ผ๋Š” ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํด๋”์•ˆ์„ ์‚ดํŽด๋ณด๋ฉด `models.py`ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— ๋ชจ๋ธ๋ง ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

โžค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Migration)

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋ž€ ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ DB*์Šคํ‚ค๋งˆ์— ์ ์šฉ์‹œํ‚ค๋Š” Django์˜ ๋ฐฉ๋ฒ• ์ด๋ผ๊ณ  ์žฅ๊ณ  ๊ณต์‹ ๋ฌธ์„œ์— ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

Django๋Š” ORM์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— models.py์™€ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด DB์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ปจํŠธ๋กคํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ DB์Šคํ‚ค๋งˆ๋ฅผ git ์ฒ˜๋Ÿผ ๋ฒ„์ „์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๋ช…๋ น์–ด

  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑ : python3 manage.py makemigrations [app_name]
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ์šฉ : python3 manage.py migrate [app_name][migration_name]
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ™•์ธ : python3 manage.py showmigrations [app_name]
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ SQL ํ™•์ธ : python3 manage.py sqlmigrate [app_name][migration_name]

  1. app์„ ์ฒ˜์Œ ์ƒ์„ฑํ•˜์˜€๋‹ค๋ฉด python3 manage.py migrate๋กœ ์ดˆ๊ธฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜์ž.

  2. ์›ํ•˜๋Š” ๋ชจ๋ธ๋ง ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค๋ฉด python3 manage.py showmigrations [app_name]์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ ๋ฌด๋ฅผ ํ™•์ธํ•˜์ž. 1๋ฒˆ์„ ์ง„ํ–‰์ „์—๋Š” ์™ผ์ชฝ๊ณผ ๊ฐ™์ด, ์ง„ํ–‰ ํ›„์—๋Š” ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

    models.py

    from django.db import models
    
    # Create your models here
    
    class PayPlan(models.Model):
        name = models.CharField(max_length=20)
        price = models.IntegerField()
        updated_at = models.DateTimeField(auto_now=True)
        create_at = models.DateTimeField(auto_now_add=True)
  3. python3 manage.py makemigrations [app_name]๋กœ ๋ชจ๋ธ๋ง ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ƒ์„ฑํ•˜์ž. ์•„๊นŒ์™€ ๋‹ค๋ฅด๊ฒŒ ์ƒ์„ฑํ•œ app๋ถ€๋ถ„์— 'no_migrations'ํ‘œ๊ธฐ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ์ƒˆ๋กœ์šด 001๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ๋‹ค์‹œ python3 manage.py migrate๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ›„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ™•์ธํ•ด๋ณด์ž.

์ด์ œ ๋ชจ๋ธ๋งํ•œ ์ฝ”๋“œ๊ฐ€ DB*์Šคํ‚ค๋งˆ์— ์ ์šฉ๋œ ๊ฒƒ์ด๋‹ค.

001_initial

์—ฌ๊ธฐ์„œ ์œ„์—์„œ ๋ชจ๋ธ๋ง ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ํ™•์ธํ•ด ๋ณด์ž. name, price, updated_at, create_at ์€ ์ž‘์„ฑํ•œ ๋Œ€๋กœ ์ƒ์„ฑํ•˜๋Š” ํ•ญ๋ชฉ์—์„œ ํ™•์ธ์ด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ id๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ƒ์„ฑํ•˜๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ถ”๊ฐ€๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ primary_key๋กœ ์นผ๋Ÿผ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ์žฅ๊ณ ์—์„œ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Django๊ฐ€ ์œ„์˜ ํŒŒ์ผ์—์„œ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด 001, 002, 003...๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์ด ๋ˆ„์ ๋˜์–ด ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.(์ ˆ๋Œ€ ์ค‘๊ฐ„์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์‚ญ์ œ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.)


๐Ÿ”– ์Šˆํผ ์œ ์ €(admin)

Django๋Š” ๊ด€๋ฆฌ์žํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์„œ๋น„์Šค๊ฐ€ ๋ฌด์ฒ™์ด๋‚˜ ๋งŽ์ด ์ œ๊ณต๋œ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ธ๋ฐ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๊ด€๋ฆฌ์ž ์Šˆํผ ์œ ์ €๋ฅผ ์ƒ์„ฑํ•ด ๋ณด์ž.

python3 manage.py createsuperuser
  1. ๋ช…๋ น์–ด ์ž‘์„ฑ
  2. Username ์ž‘์„ฑ
  3. Email ์ž‘์„ฑ
  4. Password ์ž‘์„ฑ
  5. Password ๋‹ค์‹œ ์ž‘์„ฑ (Password๊ฐ€ 8์ž๋ฆฌ ๋„˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ ๋ฌธ์ด ๋‚˜์˜ค๋‚˜ y ๋ˆŒ๋Ÿฌ pass)

๐Ÿ”– ๋ชจ๋ธ๋ง ํ™•์ธ

์œ„์—์„œ ์ž‘์„ฑํ•œ PayPlan ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•ด ๋ณผํ…๋ฐ Django๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด๋Ÿฐ ์„ค์ •์„ ํ•˜์ง€ ์•Š๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด sqlite๋กœ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ db.sqlite3๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. EXTENSIONS์—์„œ SQLite Viewer๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋‹ค์‹œํ•œ๋ฒˆ sqliteํŒŒ์ผ์„ ์—ด์–ด๋ณด์ž.

์ด์™€ ๊ฐ™์ด ํŒŒ์ผ์ด ์—ด๋ฆฌ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค๋ฉด Tablesํ•ญ๋ชฉ๊ณผ ๊ทธ ์•ˆ์— shortener_payplan์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ ์•ˆ์— ์œ„์—์„œ ์ƒ์„ฑํ•œ 0001_initialํŒŒ์ผ์˜ ๋‚ด์šฉ id, name, price, updated_at, create_at ์นผ๋Ÿผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์ด ๋ฐฉ๋ฒ• ์™ธ์—๋„ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ DBํˆด์„ ์‚ฌ์šฉ ๋“ฑ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์ด ๋ถˆํŽธํ•˜๋ฉด ๊ตฌ๊ธ€๋งํ•˜์—ฌ Django DB๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚˜๋งŒ์˜ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์ž.

profile
์ธ์ƒ ๊ฐœ๋ฐœ์ž ๋ผ๊ณฐ!!

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