[Django] Tutorial(2) ORM

토닉·2021년 4월 22일
0

Django

목록 보기
2/6
post-thumbnail

모델을 생성 후, 파이썬 쉘에서 polls api를 다뤄본 후 Django에서 자동 생성되는 관리자 사이트를 다뤄봅니다.
첫 번째 장고 앱 작성하기, part2

데이터베이스 설치

기본적으로 프로젝트는 SQLite를 사용하도록 구성되어 있습니다.
하지만 실제 프로젝트를 할 때는 PostgreSQL 같이 확장성 있는 데이터베이스를 사용하는 것이 좋습니다.

# 초기 migration 설정
python manage.py migrate

mysite/settings.py 파일의 데이터베이스 설정과 앱과 함께 제공된 데이터베이스 migration에 따라 필요한 데이터베이스 테이블을 설정하고 만듭니다.

migration??

  • 모델의 변경 내역을 DB스키마에 적용시키는 장고의 방법
  • DB 스키마를 git처럼 버전으로 나눠서 관리할 수 있게 해주는 시스템
    프로젝트 생성 후 처음 하는 migrate 작업을 위한 migration을 생성할 때 명령어
python manage.py makemigration <app-name>

이 후에 migration을 생성할 때는 app_name을 작성해야 합니다.(이유는 나중에)

프로젝트에 앱 추가

우선 앱을 프로젝트에 포함시켜야 합니다.

# settings.py
INSTALLED_APPS = [
    '앱이름.apps.앱이름config',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

위처럼 리스트에 앱이름을 작성하고 저장하면 프로젝트에 앱이 포함됩니다.

polls의 DB스키마 생성

model.py를 아래와 같이 편집하여 polls의 DB스키마를 생성해줍니다.

# polls/models.py
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

모델에서 class는 DB스키마를 생성해줍니다.
위 코드는 아래와 같은 DB를 구성하고 있습니다.

migration 명령어

마이그레이션 명령어를 통해 migrate작업을 합니다.

# 마이그레이션 생성(git의 add)
$ python manage.py makemigrations <app-name>

# 마이그레이션 적용(git의 commit)
$ python manage.py migrate <app-name>

# 마이그레이션 적용 현황
$ python manage.py showmigrations <app-name>

# 지정 마이그레이션의 SQL 내역
 python manage.py sqlmigrate <app-name> <migration-name>
python manage.py migrate polls 0001

0001은 polls 앱의 migration 버전마다의 번호입니다.
이 명령어는 migration을 실제 DB에 적용하는 명령어입니다.
git의 commit과 비슷합니다.
이전 버전으로 되돌리는 것도 가능합니다.
단 migration의 변경사항은 models.py의 DB스키마가 변동됬을 때 저장할 수 있습니다.
shell에서 record를 추가하거나 변경해도 스키마가 변경되는게 아니기 때문에 migration에 record의 값까지 저장되진 않습니다.

주의점

  • makemigrations 이후에는 migration 폴더를 확인한다!(무엇이 수정되었는지 확인)
  • makemigrations를 할 때는 app 이름을 명시하는 것이 좋다!
  • showmigrations 를 통해 적용 상태를 조회
  • sqlmigrate 명령을 통해 sql로도 확인하는 습관 필요!
  • 적용한 migration 파일은 절대로! 지우면 안된다.
  • migration 파일을 sql로도 확인하는 습관 필요!

polls의 DB스키마에 record 넣기

Python 쉘을 통해 Django API를 사용하여 방금 구성한 DB스키마에 레코드 저장하기

# Question 스키마에 record 저장
from polls.models import Choice, Question 
from django.utils import timezone
>>> q = Question(question_text = "question 1", pub_date=timezone.now())
>>> q.save()
>>> q = Question(question_text = "question 2", pub_date=timezone.now())
>>> q.save()
>>> q = Question(question_text = "question 3", pub_date=timezone.now())
>>> q.save()
# Question의 record 수정
>>> u = Question.objects.get(pk=1)
>>> u.question_text = "question 4"
>>> u.save()
# Question의 record 삭제
>>> d = Question.objects.get(pk=1)
>>> d.delete()

삭제 후 다시 record를 추가로 저장했을 때 pk=1에 저장되지 않고 마지막 id의 다음 pk로 저장됩니다.

profile
우아한테크코스 4기 교육생

0개의 댓글