Django ORM(Object Relational Mapping)
# 개요
Object-Relational Mapping(ORM)은 관계형 데이터베이스와 Django 모델 객체 간의 매핑을 제공하는 매우 유용한 기술이다.
Django를 처음 써보는, 혹 아직 써보지 않은 사람들에게는 이 개념이 잘 와닿지 않을 수 있는데, 한 마디로 SQL문을 사용하지 않고도 데이터베이스를 관리할 수 있게 해준다는 거다.
예를 들어, 데이터베이스에 'person'이라는 테이블을 생성하기 위해 다음 SQL문을 짰었다면,
CREATE TABLE person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
Django에서는 다음 코드를 실행하면 된다.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
물론 약간의 설정(DB 명세, 테이블명 포매팅 등)도 필요하지만 초보자가 무리없이 사용할 정도로 간단하다.
요는 "각 모델 클래스는 데이터베이스 테이블에 매핑된다"는 것.
# 모델
Django 모델은 데이터베이스에 매핑되는 객체이다. 보통 하나의 모델은 하나의 테이블에 매핑되며, 모델 클래스 내의 어트리뷰트들은 데이터베이스 필드를 나타낸다.
위의 예시에서 모델 Person 아래의 어트리뷰트들(first_name, last_name)은 각각 person 테이블의 first_name 필드, last_name 필드가 된다.
참고로 모델에서 id를 따로 명시하지 않는다면 ORM이 PRIMARY KEY 속성의 id 필드를 자동으로 생성해준다. PRIMARY KEY를 따로 부여하고 싶다면 해당 필드에 primary_key=True 속성을 추가하도록 한다.
# 관계형 데이터베이스
관계형 데이터베이스의 중요 역할은 모델들을 서로 엮어 관계를 형성하는 것이다. 관계형 데이터베이스의 대표적인 관계로는 1) 다대일(many-to-one), 2) 다대다(many-to-many), 3) 일대일(one-to-one) 이렇게 세 가지가 있다.
1) 다대일(many-to-one)
아마 가장 흔하게 사용되는 관계지 싶다. FOREIGN KEY에 해당하는 필드는 다른 필드와 똑같이 명시하되, 필드 타입으로 ForeignKey를 사용해야 한다.
from django.db import models
class Manufacturer(models.Model):
# ...
pass
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
# ...
참고로 ForeignKey의 파라미터로 사용된 on_delete는 삭제 옵션으로, 해당 모델이 삭제될 때 참조된 테이블의 열(row)을 어떻게 할지 결정한다. 위의 CASCADE 옵션은 참조 테이블의 열도 함께 삭제한다.
2) 다대다(many-to-many)
필드 타입이 ForeignKey에서 ManyToManyField로 바뀌는 것 외에는 다대일 관계와 거의 유사하다. 주의할 것은, 해당 필드드를 갖는 모델이 어디건 상관 없지만 반드시 하나의 모델에만 명시돼야 한다는 것이다.
from django.db import models
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
# ...
toppings = models.ManyToManyField(Topping)
3) 일대일(one-to-one)
필드 타입으로 OneToOneField를 사용한다. 일대일 관계는 어떤 객체(모델)에 다른 객체를 확장할 때 PRIMARY KEY로서 사용하기에 적합하다. 잘 이해가 안 간다면 예시를 보자.나도 잘 이해 안 갔음
# 지원 데이터베이스
Django가 공식적으로 지원하는 데이터베이스는 PostgreSQL, MySQL, SQLite, Oracle이며 이밖의 데이터베이스 연결을 위한 서드파티 어플리케이션도 많다. 다행히도 Django에는 기본적으로 SQLite가 설치되어 있기 때문에 초보자가 데이터베이스를 설치할 필요는 없다.
- 어떤 데이터베이스를 써야 할까?
SQLite: 초기 개발/테스팅 단계에서 사용한다. 절대 배포 단계에서 사용하지 말도록.
Oracle: 충분한 자금을 가지고 있는 대기업에서 사용한다. 대규모 사업에 참여하지 않는 이상, 그리고 다른 선택지가 없는 이상 사용할 일이 거의 없을 것이다.
PostgreSQL/MySQL: 알아서 선택하도록.
참고:
'개발 > Django' 카테고리의 다른 글
[Django] QuerySet을 사용할 때 쿼리를 몇 번 가져오는지 확인하자 (4) | 2019.02.13 |
---|---|
[Django] Django 에러 핸들링 (3) | 2019.02.12 |
[Django] Django Rest Framework에서 request 로깅하기 (2) | 2019.02.08 |
[Django] Django 마이그레이션 초기화하기 (9) | 2019.02.08 |
Django에서 지메일 보내기 (4) | 2018.05.31 |
댓글