파이썬 웹 프로그래밍 pg 106
에 있는 기본 테이블 설계에 나온 예시 분석해보겠다
칼럼명 | 타입 | 제약조건 | 설명 |
id | integer | NotNull, PK, AutoIncrement | Primary key |
question_text | varchar(200) | NotNull | 질문 문장 |
pub_date | datetime | NotNull | 질문 생성 시각 |
Not Null : 모든 칼럼은 Not Null로 정의되어 있기 때문에 칼럼에 값이 있어야 한다.
PK : primary Key
Auto Increment : Primary key 를 자동증가 속성으로 지정했다.
칼럼명 | 타입 | 제약조건 | 설명 |
id | integer | NotNull, PK, AutoIncrement | Primary key |
choice_text | varchar(200) | NotNull | 답변 항목 문구 |
votes | integer | NotNull | 투표 카운트 |
question | integer | NotNull, FK(Question.id), index | Foreign key |
choices테이블이다. 여기도 id는 primary key 이면서 autoincrement 속성을 가지고 있다.
qeustion칼럼의 경우 question테이블과 foreign key로 연결하도록 했고 index도 생긴다.
PK Primary key
- 주 식별자, 주키 등으로 불린다.
- 테이블은 PK또는 FK 둘 중 하나는 꼭 가지고 있어야 한다.
- PK는 각 행을 고유하게 식별하는 역할을 담당한다. 그래서 하나만 정의 간으하다.
- 지정된 칼럼에는 중복된 값이나 NULL값이 입력될 수 없다. = NotNULL + UNIQUE
- PK로 지정할만한게 여러개 있을 때 검색이 많이 사용되며 간단한 칼럼으로 지정한다.
FK foreign key
- 외부키, 참조키, 외부 식별자 등으로 불린다.
- FK가 정의된 테이블이 자식 테이블이다. 참조되는 테이블은 부모테이블
(위의 예에서는 choices는 question의 자식테이블이다.)
- 부모테이블이 미리 생성되어 있어야 가능.
- REFERENCES : 참조할 부모 테이블과 부모테이블에 있는 칼럼을 정의한다.
- ON DELETE CASCADE : 참조되는 부모테이블의 행에 대한 DELETE를 허용한다. = 부모테이블이 지워지면 같이 지워진다.
- ON DELETE SET NULL : 부모 테이블행이 지워지면 자식테이블의 값은 NULL값으로 설정된다.
- 데이터 타입이 반드시 일치해야한다. (integer이든)
- 참조되는 칼럼은 PK이거나 UK만 가능하다. (위의 예시에서는 question의 id니까 question.id)
직접 python으로 테이블을 정의하면 이렇게 된다
from django.db import models
# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
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 self.choice_text
# 테이블 정의한거
칼럼명 | 타입 | 제약조건 | 설명 |
id | integer | NotNull, PK, AutoIncrement | Primary key |
question_text | varchar(200) | NotNull | 질문 문장 |
pub_date | datetime | NotNull | 질문 생성 시각 |
id의 경우 장고가 자동적으로 만들어주고
question_text는 max_length 200으로 charfield정의
pub_date는 datetime타입으로 설정.
칼럼명 | 타입 | 제약조건 | 설명 |
id | integer | NotNull, PK, AutoIncrement | Primary key |
choice_text | varchar(200) | NotNull | 답변 항목 문구 |
votes | integer | NotNull | 투표 카운트 |
question | integer | NotNull, FK(Question.id), index | Foreign key |
choices테이블의 경우에도
choice_text는 charfield로
votes는 integerfield
question는 foreign key 함수로 만든다.
주의할점 몇개
- PK는 클래스에 지정해주지 않아도 장고는 항상 PK속성을 자동으로 만들어 준다.
- DateTimeFIeld() 필드 클래스에 정의한 date published 는 pub_date칼럼에 대한 레이블 문구로 admin에서 이 문구를 보게 된다.
- FK foreignkey의 경우 다른 테이블 question의 PK와 연결되므로 question 클래스는 id변수까지 지정할 필요 없이 question 클래스만 지정하면 됩니다. 실제 테이블에서 FK로 지정된 칼럼은 _id접미사가 붙는다는 점도 알아 두기.
- __str__()메소드는 객체를 문자열로 표현할 때 사용되는 함수. admin사이트 등에서 테이블명을 보여줘야 하는데 그때 테이블명이 제대로 표시되도록 하는 것.
'파이썬' 카테고리의 다른 글
urlconf 코딩해보기 (0) | 2020.09.20 |
---|---|
admin에 테이블 등록해보기 (0) | 2020.09.19 |
MVT - Models 내용 (0) | 2020.09.19 |
프로젝트 생성전 = 뼈대 디렉토리 및 파일에 대한 설명 (0) | 2020.09.19 |
Template 화면 UI 정의 (0) | 2020.09.18 |
정규표현식에 사용되는 문자의 의미. (0) | 2020.09.13 |
Django's MTV pattern 과 코딩 순서 (0) | 2020.09.13 |
간단 wsgi server 까지 (0) | 2020.09.12 |