수학과의 좌충우돌 프로그래밍

[Django] model 더 알아보기, ORM, model의 option, migrate 본문

웹프로그래밍/Django

[Django] model 더 알아보기, ORM, model의 option, migrate

ssung.k 2019. 7. 17. 01:16

model 에 대한 두 번째 포스팅입니다. 저번 포스팅은 django 를 처음 공부하면서 정말 기본적인 내용에 썼다면, 이번에는 공부하면서 좀 더 필요하다고 생각이 된 부분들에 대해서 새롭게 추가해보았습니다.

ORM 이란?

ORM 이란 object-relational mapping 의 줄임말로서 영어 그대로 해석하면 객체의 관계를 연결해주는 것을 뜻합니다. 데이터베이스는 SQL 로 관리를 하게 되는데 DJango 같은 경우, 파이썬 코드와 SQL 를 매핑 시켜줌으로서 파이썬 코드로도 쉽게 데이터베이스를 다룰 수 있게 됩니다. 좀 더 정확히 말하자면 데이터베이스 테이블models.py 의 파이썬 클래스 를 1대1로 매핑하게 됩니다. 장고의 장점 중 하나로도 ORM 기능이 지원되는 점이 뽑힐 만큼 매력적인 부분입니다.

 

자주 쓰는 필드의 option

model 에서 여러 필드를 정의할 수 있습니다. 필드를 정의 할 때 여러 option을 정해줌으로서 더 유연하게, 더 엄격하게 작성할 수 있습니다. 각 필드의 종류마다 사용되는 option이 다르지만 공통적으로 많이 쓰는 option 에 대해서 정리해보았습니다.

  • blank : empty 허용 여부 ( 기본 값은 false)

  • null : DB 기준으로 null 허용 여부 ( 기본 값은 false)

    • CharFieldTextField 같은 문자열 기반 필드에서는 null=True를 지양합니다.

      이럴 경우, 데이터가 없는 경우에 대해서 None 값과, 빈 문자열 을 가지는 2가지 경우가 생겨버려서 문제가 생깁니다. 따라서 django 의 경우, Null 이 아닌 빈 문자열을 하기로 약속했기에 null=True 는 쓰지 않으시는 걸 추천합니다.

  • db_index : DB 기준으로 인데스 필드 여부, index 로 값에 접근 가능 ( 기본 값은 false)

  • default : 값이 입력되지 않았을 때 어떤 값이 기본값으로 들어갈지 지정

  • unique : DB 기준으로 현재 테이블 내에서 유일성 여부 ( 기본 값은 false)

  • validatiors : validators 를 수행할 함수를 다수 지정

  • verbose_name : 필드 레이블 (기본 값은 필드명)

  • help_text : 필드 입력 도움말

 

blank 와 null 은 헷갈리기 쉬운 개념입니다.

blank 는 입력을 받는 상황에서 비어있는 값이 입력이 될 수 있는지를 판단하는 옵션입니다.

null은 위에서 언급한대로, DB에서의 필드로서 NULL이 들어갈 수 있는지를 판단하는 옵션입니다.

 

공통적으로 사용 되지는 않지만, 날짜 및 시간에 자주 사용되는 옵션도 있습니다.

class Item(models.Model):
  create_at = models.DateTimeField(auto_now_add=True)
  update_at = models.DateTimeField(auto_now=True)

필드의 이름에서 눈치 채셨을 수도 있지만 auto_now_add 은 객체가 만들어지는 순간의 시간이 저장되고 auto_now 는 객체의 값이 갱신될 때마다 새로 시간이 저장됩니다.

 

migrate 더 알아보기

저번 포스팅에서도 다뤆지만 migrate 는 migration 파일을 db 에 적용시키는 명령어 였습니다. 좀 더 나아가서 여러 활용법을 알아보도록 하겠습니다.

  • sqlmigrate

    migrate 는 migration 파일을 db에 적용시키는 명령어 였다면, sqlmigrate는 그 이전에 테스트 하는 명령입니다. 아래 명령어를 통해 sql 을 확인할 수 있고 개발자의 의도에 맞게 생성이 되었는지 판단의 척도가 됩니다.

    python manage.py sqlmigrate {앱이름} {migrations 파일 번호}
    
    # 예시
    python manage.py sqlmigrate myapp 0002
    

    여기서 migrations의 파일이름을 전부 기재해주는게 원칙이지만 파일이름의 일부만을 사용해도 같으 효과를 가져올 수 있습니다. 단 다른 파일과 중복되게 일부만 기재해주는 건 문제가 발생합니다.

  • migrate

    migrate 를 통해 migration 파일로 db 설정을 최신화 하기도 하지만, 뒤에 파일 번호를 추가해서 해당 파일로 갱신하기도 합니다. 예를 들어 현재 4번까지 migration 파일이 생성되었고 현재 적용 상태가 3번이라도 0002 를 migrate 한다면 과거의 설정 상태로 바뀌게 된다.

    python manage.py migrate {앱이름} {migration 파일 번호}
    

     

Comments