์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ๋น ๋ฐ์ดํฐ
- KDT_TIL
- ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ
- Speculative Execution
- Salting
- etl
- Kafka
- topic
- Docker
- backfill
- Spark Partitioning
- off heap memory
- Dag
- k8s
- aws
- spark executor memory
- mysql
- Spark ์ค์ต
- CI/CD
- Spark SQL
- Kubernetes
- SQL
- redshift
- Spark
- Spark Caching
- AQE
- disk spill
- colab
- Airflow
- DataFrame Hint
- Today
- Total
JUST DO IT!
[TIL]KDT_20230424 ๋ณธ๋ฌธ
๐ KDT WEEK 4 DAY 1 TIL
- Django
- Django ๋ง๋ณด๊ธฐ
- Django Shell
์ฌ์ฉํ ํ๊ฒฝ : ์๋์ฐ ํฐ๋ฏธ๋ + python ๊ฐ์ํ๊ฒฝ + Django + VSC (Windows 10)
๐ฅ Django
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ์น ์ฌ์ดํธ ์์ฑ์ ํนํ๋ ํ์ด์ฌ์ ์คํ ์์ค ์น ํ๋ ์์ํฌ
ํฐ๋ฏธ๋์ ๊ฐ์ํ๊ฒฝ์์ ์ฌ์ฉํ ๋ช ๋ น์ด ์์ฃผ๋ก ์ค๋ช ํ๊ฒ ๋ค!
- django-admin startproject mysite : "mysite" ์ด๋ฆ์ ์๋ก์ด Django ํ๋ก์ ํธ ์์ฑํ๊ธฐ
Visual Studio Code์์ ์์ฑ๋ mysite ํด๋๋ฅผ ์ด์ด๋ณด๋ฉด, ์ด๋ฏธ์ง์ฒ๋ผ .py ํ์ผ๋ค์ด ๋ง์ด ์์ฑ๋์ด ์๋ค. (polls ํด๋ ์ ์ธ)
- python manage.py runserver : ์๋ฒ๋ฅผ ๊ตฌ๋ํ๋ ๋ช
๋ น์ด
- ๋ช ๋ น์ด ์ ๋ ฅ ํ ๋ํ๋ ์ฃผ์, 127.0.0.1:8000 ์ผ๋ก ์ ์ํ๋ฉด..
- python manage.py startapp polls : "polls" ์ฑ์ ์ถ๊ฐํ๋ค. mysite ํด๋์ polls ํด๋์ ์ฌ๋ฌ .py ํ์ผ์ด ์ถ๊ฐ๋๋ค.
- ์ฑ์ url์ ๋ถํ ํ์ฌ ๊ด๋ฆฌํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค์ด์ฃผ๋ ๊ฒ!
URL ๊ฒฝ๋ก(path) ์ค์ ํด๋ณด๊ธฐ
mysite > urls.py ์์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด์ค๋ค.
polls ํด๋์ urls์์ polls/ ์ดํ์ url์ ์ปจํธ๋กคํ๋๋ก ํ๋ ์ฝ๋์ด๋ค.
polls > urls.py ์์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด์ค๋ค.
- polls/ ์ดํ์ ๊ฒฝ๋ก๋ฅผ ๋ค๋ฃจ๋ ๊ณผ์ ์ด๋ค.
- ์์๋ก, ์ฒซ ๋ฒ์งธ path์ ๊ฒฝ์ฐ http://127.0.0.1:8000/polls/ ์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ๋งก์๋ค.
- ํ์ด์ง์ ์ถ๋ ฅ์ views.py๊ฐ ๋ด๋นํ๋ฏ๋ก views๋ฅผ importํ์ฌ ๊ฐ์ ธ์ค๋๋ก ํ๋ค.
polls > views.py ์์ HttpResponse๋ฅผ ํตํด ๊ฐ๋จํ ์ถ๋ ฅ์ ์ค์ ํด์ฃผ๋ฉด..
๋ชจ๋ธ ์ค์ ํ๊ธฐ
๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๋ค๋ฃฌ๋ค.
- ๋ชจ๋ธ ์์ฑํ๊ธฐ + (์ฑ ๋ฑ๋กํ๊ธฐ)
- ๋ชจ๋ธ์ ํ ์ด๋ธ์ ์จ ์ฃผ๊ธฐ ์ํ Migration์ ๋ง๋ ๋ค. (makemigrations)
- ๋ชจ๋ธ์ ๋ง๋ ํ ์ด๋ธ์ ๋ง๋ ๋ค (migrate)
1. ๋ชจ๋ธ ์์ฑํ๊ธฐ
๋ชจ๋ธ์ polls > models.py ์์ ์์ฑํ๋ค
- class๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ ๋ง๋ค๊ณ , ๊ผญ models.Model์ ์์๋ฐ์์ผ ํ๋ค
- ๋ชจ๋ธ ์์ ์ฌ์ฉํ ์์ฑ(attribute)์ ํ์
(Field)์ ํจ๊ป ์ ์ํ๋ค.
- https://docs.djangoproject.com/en/4.2/ref/models/fields/ ์์ ์ฌ๋ฌ ํ๋์ ์ต์ ์ ํ์ธํ ์ ์๋ค!
- id๋ Migrationํ๋ฉด์ ์๋์ผ๋ก ์์ฑ๋๋ค.(Django ๊ธฐ๋ฅ)
- ์์ ๋๋ ๊ฒฝ์ฐ, ๋ค์ migrate๊ฐ ํ์ํ๋ค.
from django.db import models
from django.utils import timezone
import datetime
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True) # ์ง๋ฌธ์ ์์ฑ ๋ ์ง # auto_now : ์
๋ฐ์ดํธ๋ ๋๋ง๋ค, auto_now_add : ์๋ก ๋ฑ๋ก๋ ๋๋ง
# score = models.FloatField(default=0)
# is_something_wrong = models.BooleanField(default=False)
# json_field = models.JSONField(default=dict)
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
def __str__(self): # ์๊ธฐ ์์ ์ ๋ฌธ์์ด๋ก ์ ์ํ ๋ ์ด๋ป๊ฒ ์ ์ํ ์ง?
if self.was_published_recently:
new_badge = "NEW!!!"
else:
new_badge = ''
return f'{new_badge} ์ ๋ชฉ : {self.question_text}, ๋ ์ง : {self.pub_date} '
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return f'[{self.question.question_text}] {self.choice_text}'
์ฑ ๋ฑ๋กํ๊ธฐ
polls > apps.py๋ฅผ ํ์ธํด๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ class๋ฅผ ์ฐพ์ ์ ์๋ค. ์ด๊ฑธ mysite > settings.py์ ๋ฑ๋กํด์ผํ๋ค.
mysite > settings.py์ INSTALLED_APPS์ polls์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ํด๋์ค ์ด๋ฆ์ผ๋ก ์์ฑํด์ค๋ค (์ตํ๋จ๋ถ)
2. Migration ๋ง๋ค๊ณ ํ ์ด๋ธ ์์ฑํ๊ธฐ
์๊น์ ํฐ๋ฏธ๋ ๋ช ๋ น์ด๋ก ๋์์์,
- python manage.py makemigrations polls : polls ์ฑ์ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ง๋ ๋ค.
- python manage.py sqlmigrate polls 0001 : 0001๋ฒ์งธ์ polls์ฑ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ณด๋ฅผ ํ์ธํ๋ค.
- python manage.py migrate : ๋ง๋ค์๋ ๋ง์ด๊ทธ๋ ์ด์
์ ์งํ์ํจ๋ค. (ํ
์ด๋ธ์์ฑ)
- python manage.py migrate polls 0001 : 0001๋ฒ์งธ์ polls์ฑ ๋ง์ด๊ทธ๋ ์ด์ ์ํ๋ก ๋์๊ฐ๋ค
- !์ฃผ์ : ๋์๊ฐ ์ํ ์ดํ์ ๋ณ๊ฒฝ์ฌํญ๊ณผ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์ ๊ฑฐํด์ผํ๋ค.
sqlite3์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ธํ๊ธฐ
Django๋ sqlite3๋ฅผ ๋ฐ๋ก ์๋์ง์ํ๋ค๊ณ ํ๋๋ฐ, ๋๋ ๋ฐ๋ก ์คํ๋์ง ์์๋ค. (์๋์ฐ๋ผ ๊ทธ๋ฐ๊ฐ?)
์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ์๋์ผ๋ก ๋ค์ด๋ฐ์ ์ค์ ํด์ค์ผ ํ๋ค.
sqlite ๋งํฌ : https://sqlite.org/download.html ์์ sqlite-tools-win32-.. ๋ฅผ ๋ค์ด๋ฐ์ ์ ์ฅํ๊ณ ,
์๋์ฐ ํ๊ฒฝ๋ณ์ ์ค์ ์์ ์ถ๊ฐํด์ฃผ๋ฉด ์ ์์๋ํ๋ค.
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ : https://bskyvision.com/entry/sqlite3-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-path-%EC%84%A4%EC%A0%95
- sqlite3 db.sqlite3 : db.sqlite3 ํ์ผ์ ํตํด Django ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ๋ค.
> sqlite3 ๋ช ๋ น์ด
- .table : ์ ์ฒด ํ ์ด๋ธ ํ์ธ
- .schema ํ ์ด๋ธ์ด๋ฆ : ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ํ์ธ
- SQL๋ฌธ ์ํ(SELECT ๋ฑ)
๊ด๋ฆฌ์(admin) ๊ณ์ ์์ฑํ๊ธฐ
- python manage.py createsuperuser : admin ๊ณ์ ์์ฑ
- admin์ CRUD ๊ธฐ๋ฅ์ ์ ์ดํ ์ ์๋ค.
- http://127.0.0.1:8000/admin/ ์์ ๊ณ์ ๊ณผ ํ
์ด๋ธ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- polls\admin.py์ admin.site.register(๋ชจ๋ธ์ด๋ฆ)์ ์ถ๊ฐํจ์ผ๋ก์จ admin์ด ์ฌ์ดํธ์์ ์ ์ด ๊ฐ๋ฅ
- admin.py์ ๋ชจ๋ธ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ models.py์ ํด๋์ค๋ฅผ import ํด์ผํ๋ค
๐ฆ Django Shell
- python manage.py shell : Django Shell์ ์ง์
ํ๋ ๋ช
๋ น์ด
- ๋ฐ์ดํฐ ์กฐํ๋ ์ ์ด(CRUD)๋ฅผ shell์์ ์ฝ๊ฒ ์กฐ์์ด ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
- ์ ์ฒด ํ๋ก์ ํธ ๊ด์ ์ผ๋ก ์คํ๋๋ฏ๋ก import์ ํด๋์์น์ ์ฃผ์ํ๋ค.
๋ช ๋ น์ด๋ฅผ ์ค๋ช ํ ๋, ํธ์์ ์์์ ์ ์ํ ๋ชจ๋ธ์ ๋ค์ด ์์๋ก ์ค๋ช ํ๊ฒ ๋ค
๋ชจ๋ธ : Question, Choice
๋ชจ๋ธ ์ค๋ธ์ ํธ, ์์ฑ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
- from polls.models import *
polls ์ฑ์ models์์ ์ ์๋ ํด๋์ค๋ฅผ ๋จผ์ import ํด์ผํ๋ค.
- Question.objects.all()
Question ๋ชจ๋ธ์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์จ๋ค (List)
- choice = Choice.objects.first()
Choice ๋ชจ๋ธ์ ์ฒซ ๋ฒ์งธ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์จ๋ค. // last() : ๋ง์ง๋ง
- choice.pub_date
ํด๋น ์ค๋ธ์ ํธ(choice)์ pub_date ์์ฑ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- choice.question
์ธ๋ํค๋ก ์ฐ๊ฒฐ๋ question ์ค๋ธ์ ํธ๋ฅผ ์์ฑ ๊ฐ ๊ฐ์ ธ์ค๋ฏ ๊ฐ์ ธ์ค๋ ๊ฒ๋ ๊ฐ๋ฅ
- choice.question.pub_date
ํด๋น choice์ ์ฐ๊ฒฐ๋ question ์ค๋ธ์ ํธ์ pub_date๋ฅผ ๊ฐ์ ธ์จ๋ค
- question.choice_set.all()
ํด๋น question๊ณผ ์ฐ๊ฒฐ๋ ๋ชจ๋ Choice๋ค์ ๊ฐ์ ธ์จ๋ค
๋ ์ฝ๋ ์์ฑํ๊ธฐ
q1 = Question(question_text = "์ปคํผ vs ๋
น์ฐจ")
q1.pub_date = timezone.now()
q1.save()
- question_text๋ฅผ "์ปคํผ vs ๋ น์ฐจ" ๋ด์ฉ์ผ๋ก ์์ฑํ์ฌ q1์ ๋จผ์ ์ ์ฅํ๋ค.
- pub_date๋ ํ์ํ๋ฏ๋ก timezone.now()์ ํ์ฉํ์ฌ ํ์ฌ์๊ฐ์ ์ ์ฅํ๋ค.
- timezone์ Django์ ๊ธฐ๋ฅ์ผ๋ก, datetime๊ณผ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ค.
- from django.utils import timezone
- .save() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋๋ค.
q1.choice_set.create(choice_text = "b")
choice_c = Choice(choice_text='c', question=q1)
choice_c.save()
- q1์ choice_set์ ์๋ create ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ฐ๋ก q1๊ณผ ์ฐ๊ฒฐ๋ Choice ์ค๋ธ์ ํธ ์์ฑ๊ฐ๋ฅ (DB ๋ฐ๋ก๋ฐ์)
- choice ์ค๋ธ์ ํธ์ ๊ฒฝ์ฐ ์ ์ฝ๋์ฒ๋ผ ์ธ๋ํค ํ ๋น๊น์ง ์ ๋๋ก ํด์ค์ผํ๋ค.
๋ ์ฝ๋ ์์ ๋ฐ ์ญ์ ํ๊ธฐ
q = Question.objects.last()
q.question_text += '???'
q.delete()
- q์ ์์ฑ ๊ฐ์ ์กฐํํด์ ์ฐ์ฐ์๋ก ๋ฐ๋ก ์์ ๊ฐ๋ฅ (save ํด์ผ DB ๋ฐ์๋จ)
- .delete() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ํด๋น ์ค๋ธ์ ํธ ์ญ์ ๊ฐ๋ฅ (DB ๋ฐ๋ก๋ฐ์)
๋ชจ๋ธ ํํฐ๋ง
Question.objects.get(id=1)
Question.objects.get(question_text__startswith='ํด๊ฐ๋ฅผ')
# Question.objects.get(pub_date__year=2023) # ์ฌ๋ฌ ์ค๋ธ์ ํธ๊ฐ ํด๋น๋๋ฉด ์๋ฌ๋ฐ์
- .get()๋ฅผ ์ฌ์ฉํ๋ฉด ์กฐ๊ฑด์ ํด๋นํ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ํ๋จ ๋ฐ ๋๋ฒ( __ ) ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ์กฐ๊ฑด์ ๋ฃ์ด์ค ์๋ ์๋ค. (startswith : ~๋ก ์์ํ๋)
- https://docs.djangoproject.com/en/4.2/ref/models/querysets/ ์์ ์ฌ๋ฌ๊ฐ์ง ์กฐ๊ฑด์ ํ์ธํ ์ ์๋ค!
- get์ ์ฌ๋ฌ ์ค๋ธ์ ํธ๊ฐ ํด๋น๋๋ฉด, ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
Question.objects.filter(pub_date__year=2023)
Question.objects.exclude(pub_date__year=2023)
Question.objects.filter(pub_date__year=2023).count()
Question.objects.filter(pub_date__year=2023).query
- .filter()๋ get๊ณผ ๋ค๋ฅด๊ฒ ์ฌ๋ฌ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. (List)
- .exclude()๋ filter()์ ์ ๋ฐ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค. ( WHERE NOT )
- .count()๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น๋ ์ค๋ธ์ ํธ์ ๊ฐ์๋ฅผ ์ ์ ์๋ค.
- .query๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํํฐ์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ ์ ์๋ค. (์ด๊ฑด filter๋ฟ๋ง์๋๋ผ ๋ชจ๋์ ํด๋น)
๐ค ๊ณต๋ถํ๋ฉด์ ์ด๋ ค์ ๋ ๋ด์ฉ
์์ํ๋๊ฒ ์ ์ผ ์ค๋๊ฑธ๋ ธ๋คใ ใ ใ ใ ใ ใ
์๋์ฐ ํฐ๋ฏธ๋๋ ์ฒ์ ์ฌ์ฉํด๋ดค๊ณ .. sqlite3๋ path ์ค์ ์์ด๋ ์คํ๋์ง์์๋ค..
๊ฐ์๋ณด๋ ์๊ฐ๋ณด๋ค ์ด๋ฐ๋ฐ์ ์๊ฐ์ ๋ ๋ง์ด ์ด๊ฒ๊ฐ์ง๋ง, ์ด๊ฒ๋ ๋ค ๋ด๊ฐ ๋ฐ์ ํด๊ฐ๋ ํ์ด ๋๊ฒ ์ง..!
๊ทธ๋๋ ๊ฐ์๋ ์์ ์ ๋งฅ์ผ๋ก Django๋ฅผ ์จ๋ณธ์ ์ด ์์ด์ ๊ด์ฐฎ์๋ค ๐
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]KDT_20230426 (0) | 2023.04.26 |
---|---|
[TIL]KDT_20230425 (0) | 2023.04.25 |
[TIL]KDT_20230421 (0) | 2023.04.21 |
[TIL]KDT_20230420 (0) | 2023.04.20 |
[TIL]KDT_20230419 (0) | 2023.04.19 |