2010년 6월 7일 월요일

03 - 1) CREATE TABLE

앞에서 Model 을 사용하기 위한 기본적인 사항에 대해 알아보았습니다.

이제 본격적으로 django의 Model을 이용해 자료를 관리하는 방법에 대해 알아보겠습니다.

 

자료 구조의 생성 (CREATE TABLE)

Databse에서 사용되는 CREATE TABLE의 기능을 하는 것이 Model-개요에서 설명한 바와 같이 Application의 models.py에 저장할 Table명의 class를 적용하는 것입니다.

 

본 수업에서는 다음과 같은 Table을 만들도록 하겠습니다.(Application은 itemBank라고 가정하도록 하겠습니다.)

 

  1. models.py
  2. from django.db import models
  3.  
  4. class Department(models.Model):
  5. dName = models.CharField(max_length=40)
  6.  
  7. class Student(models.Model):
  8. sID = models.CharField(max_length=8)
  9. sName = models.CharField(max_length=50)
  10. sDept = models.ForeignKey(Department)
  11.  
  12. class Subject(models.Model):
  13. sName = models.CharField(max_length=50)
  14. sStudent = models.ManyToManyField(Student)
  15.  

 

위와 같이  models.py를 작성하고 제대로 작성되어 있는지 쉘에서 몇가지 확인을 해 보도록 합니다.

 

$ python manage.py validate

작성한 models.py의 오류가 있는지 점검합니다.

 

$python manage.py sqlall itemBank

django에서 정의한 Model이 설치된 DB에 저장될 때 사용된 SQL 문을 출력합니다. (sql Option과 다른 점은 sql Option의 경우 CREATE TABLE 문만을 보여주지만 sqlall을 사용하게 되면 Index 등 실제 사용된 모든 쿼리를 보여줍니다.)

 

 

자료형 정의

 

위에서 생성한 자료구조(테이블)에 대해 설명하자면 다음과 같습니다.

테이블 명 속성명 자료형 Extra
Department dName CharField(문자열) 최대 길이 : 40
Student sID CharField(문자열) 최대 길이 : 8
  sName CharField(문자열) 최대 길이 : 50
  sDept   Foreign Key
Subject sName CharField(문자열) 최대 길이 : 50
  sStudent   Many to Many Field

 

자료구조를 정의한다는 것은 테이블 별로 입력될 데이터에 대한 정의를 내리는 것을 의미합니다.

테이블은 한 개 이상의 속성을 갖게 되는데 속성을 정의할 시 우선적으로 고려된는 것이 저장되는 자료의 형태(Data Type)입니다. 앞선 자료에서는 전부 문자열 자료만 사용하였는데 django에서 지원하는 자료형은 다음과 같습니다.

 

  • 논리 자료
  • BooleanField([**options])

    • NullBooleanField([**options])

      • BooleadField와 동일하나 NULL을 허용한다. (BooleanField(null=True) 와 동일)
    • True/False 값만을 허용한다.
  • 숫자 자료

    • FloatField([**options])

      • 부동소수점 수를 허용한다.
    • DecimalField(max_digits=None, decimal_places=None[, **options])

      • 고정소수점 수를 허용하는 것으로 사용법은 아래와 같다.

        • 정수부는 999까지 갖고 소수점부는 2자리까지 허용 : DecimalField(max_digits=5, decimal_places=2)
        • 정수부 9자리와 소수점 10자리 허용 : DecimalField(max_digits=19, decimal_plaes=10)
    • IntegerField([**options])

      • 정수 허용
    • PositiveIntegerField([**options])

      • 양의 정수 허용
    • SmallIntegerField([**options])

      • 각종 데이터베이스 상의 Small Integer에 해당하는 작은 정수 허용
    • AutoField(**options)IntegerField와 동일하나 값이 자동으로 증가
  • 문자자료

    • CharField(max_length=None[, **options])

      • 문자열을 저장한다. (실제 사용되는 DataBase 상의 문자열 크기 대응)
    • TextField([**options])

      • CharField보다 춸씬 긴 문자열을 허용한다.
    • CommaSeparatedIntegerField(max_length=None[, **options])

      • Comman(,)로 구별되어지는 정수값을 허용한다. 실제 사용은 CharField 와 유사하고 DataBase가 지원 가능하여야 한다.
    • URLField([verify_exists=True, max_length=200, **options])

      • URL 값을 허용한다.
    • SlugField([max_length=50, **options])

      • 뉴스에서 사용되는 용어인 slug를 위한 문자열 허용
  • 날짜 / 시간 자료

    • DateField([auto_now=False, auto_now_add=False, **options])

      • Python 의 datetime.date 형태의 값을 허용하는 것으로 날짜가 저장된다.
    • DateTimeField([auto_now=False, auto_now_add=False, **options])

      • Python의 datetime.datetime 형태의 값을 허용하는 것으로 날짜와 시간이 저장된다.
    • TimeField([auto_now=False, auto_now_add=False, **options])

      • 시간값을 허용한다.
  • 기타

    • EmailField([max_length=75, **options])

      • Email 형태의 값이 허용되며 입력시 유효한 값인지 점검한다.
    • FileField(upload_to=None[, max_length=100, **options])

      • 업로드된 파일명이 허용된다.
    • FilePathField(path=None[, match=None, recursive=False, max_length=100, **options])

      • 지정한 디렉토리에 한정적인 이름을 갖도록한다.
    • ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])

      • FileField와 유사하지만 그림만을 허용한다.
    • IPAddressField([**options])

      • IP 값을 허용한다.
    • XMLField(schema_path=None[, **options])

      • XML 자료의 입력을 허용한다.

 

 

이상의 자료형에 대한 지정외에 Student 테이블의 sDept와 같이 다른 테이블 자료와의 관계를 설정할 수 있습니다.

  • ForeignKey(othermodel[, **options])

    • 1대다 관계를 설정하는 것으로 해당 속성의 값은 외부로 부터 참조되었음을 알린다.
  • ManyToManyField(othermodel[, **options])

    • 다대다 관계를 설정하는 것으로 ManyToManyField를 지정하면 django가 Many to Many를 위한 별도의 테이블을 만들고 만들어진 테이블과 ForeignKey와 유사한 관계를 설정한다.

 

자세한 내용은 자료를 입력하면서 설명하도록 하겟습니다.

 

Foreign Key (FK)

외래키라 불리우며 해당 Column의 값은 자료 입력시 만들어지는 것이 아니고 외부로 부터 오는 값을 나타내는 것으로 여기서 외부라고 말하는 것은 특정 Table의 특정 열의 값입니다.

즉, 현재 입력할 자료의 값은 외부 값을 참조하라는 의미로 이미 저장된 값을 가져오게 합니다.

만 일 참조 대상값이 참조할 Table에 없을 경우 참조 무결성을 깨트리게 되어 에러를 발생하게 됩니다.

위에서 자료를 입력할 때마다 Statistics라고 입력하는 것은 오탈자 등이 생길 수 있으므로 개념상 어렵게 느껴지기만 하지만 알게되면 좀 더 정확한 자료를 유지할 수 있게됩니다.

또한 Foreign Key에 의해 Table 간의 계층 구조가 생깁니다.

위의 예에서는 계층구조상 Department 하위에 Student 가 존재하게 됩니다.

이 말은 Student 자료가 존재하기 위해서는 참조할 Department 값이 사전에 있어야 함을 의미합니다.

그리고 DB에서는 Department 자료를 삭제할 경우 해당 값을 참조하는 Table이 있는지 검색하여 삭제를 못하게 하거나 혹은 에러 메세지를 보여주게 됩니다.(물론 이런 검사없이 바로 삭제하는 옵션이 있습니다.)

 

정상적으로 잘 만들어졌다면 이제 위에서 정의한 자료 구조를 통해 자료의 입출력에 대해 알아보도록 하겠습니다.

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기