[Django 06] SQLite 모델 만들기

이제 모델을 만들겁니다.

장고 프로젝트 폴더로 이동합니다.
아래 명령어를 실행합니다.
마이그레이트를 하는건데, 기본 설정을 잡아주는것으로 알고 있습니다.

python3 manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.

모델 만들기

모델 : 부가적인 메타데이터를 가진 데이터베이스의 구조(layout)
– 데이터에 관한 단 하나의, 가장 확실한 진리의 원천.
장고는 DRY(Dont Repeat Yourself) 원칙을 따름
http://wiki.c2.com/?DontRepeatYourself

Question과 Choice 모델을 만들거고, Question은 질문과 일자를 가지고 있을 겁니다.
Choice는 두개의 필드를 가집니다.(the text of the choice and a vote tally). 각 Choice는 Question과 관련있습니다.

polls/models.py 파일을 생성합니다.

from django.db import models

# 모델의 활성화
# 앱을 위한 데이터베이스 스키마 생성(CREATE TABLE)
# Question과 Choice 객체에 접근하기 위한 Python 데이터베이스 접근 API 생성

# 현재 프로젝트에게 polls 앱이 설치 되었다는것을 알려야 한다. (앱을 꼈다 뺐다 할수 있다.)
# 앱을 현재의 프로젝트에 포함시키기 위해서는 settings.py > INSTALLED_APPS 설정에 추가해야 한다. 
# PollsConfig 클래스는 polls/apps.py 파일 내에 존재 -> polls.apps.PollsConfig




# django.db.models.Model subclass
# 데이터베이스의 각 Field는 클래스의 인스턴스로 표현
    
# 각 필드 
# CharField는 문자 필드
# DateTimeField는 날짜와 시간(datetime) 필드 등

# 각 필드의 인스턴스 이름(question_text)은 
# 기계가 읽기 좋은 형식(machine-friendly format)의 데이터베이스 필드 이름은
# 필드명을 Python 코드에서 사용할 수 있으며, 데이터베이스에서는 컬럼명으로 사용 

# 필드 클래스의 생성자에 선택적인 첫번째 위치 인수를 전달하여 사람이 읽기 좋은(human-readable)
# 이름을 지정할 수도 있다. -> Question.pub_date

# 몇몇 Field 클래스는 인수가 필요합니다. (CharField의 경우 max_length)
# Field는 다양한 선택적 인수들을 가질수 있다.
class Question(models.Model):    
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

#  ForeignKey를 사용한 관계설정
#  각각의 Choice가 하나의 Question에 관계된다는 정보.
#  question = models.ForeignKey(Question, on_delete=models.CASCADE)
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

위와 같은 코드를 작성하고 다음 명령을 통해 변경시킨 모델을 migration으로 저장하고 싶다고 장고에게 알려준다.

python3 manage.py makemigrations polls

-> 결과
Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

잘 보면 polls 밑에 migrations 폴더와 0001 이름의 모델이 생성되었다.

아래 코드를 실행해보면, 내부적으로 어떤 SQL 문장이 실행되는지 알수 있다.

python3 manage.py sqlmigrate polls 0001

-> 결과테테테ㅌ
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;

테이블 이름은 앱 이름 + _ + 모델의 이름으로 자동 생성한다.
기본키 id도 자동 생성되고, 재지정이 가능하다.
외래 키 필드명에 “_id” 이름이 자동으로 추가된다. (재지정 가능)

python manage.py migrate

migrate 명령은 아직 적용되지 않은 마이그레이션을 모두 수집해 이를 실행하며(Django는 django_migrations 테이블을 두어 마이그레이션 적용 여부를 추적한다), 이 과정을 통해 모델에서의 변경 사항들과 뎅터베이스의 스키마의 동기화가 이루어진다.

마이그레이션은 매우 기능이 강력하여, 데이터베이스나 테이블을 수정하지 않고 모델의 반복적인 변경을 가능하게 해준다. 동작중인 데이터베이스를 자료 손실없이 업그레이드 하는 데 최적화 되어 있다.

모델의 변경을 만드는 세단계의 지침

1. (moles.py에서) 모델을 변경
2. python manage.py makemigrations 
 -> 변경사항에 대해 마이그레이션을 만듬
3. python manage.py migrate
 -> 변경 사항을 데이터베이스에 적용

manage.py 유틸리티로 어떤 일들을 할 수 있는지 django-admin 문서를 읽어보세요.