작성자 | 이재영 |
일 시 | 2024. 3. 28 (목) 18:00 ~ 21:00 |
장 소 | 복지관 b128-1호 |
참가자 명단 | 임혜진, 이재영, 성창민, 김명원, 장원준 |
사 진 |
목차
- ORM 이란?
- 데이터 조회
- 데이터 생성
- 데이터 업데이트
- 데이터 삭제
- 데이터 필터링
- filter
- exclude
- 더블 언더스코어 ("__")
ORM 이란?
Object Relational Mapping(객체 관계 매핑) : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다.
말 그대로 ORM은 프로그래밍 언어의 객체와 관계형 데이터베이스의 데이터를 자동으로 매칭해주는 도구이다. 예를들어 SQL문으로 데이터를 조회하는 명령어인 SELECT * FROM table; 를 ORM을 사용하면 table.objects.all() 이런 식으로 메소드 호출을 통해 데이터 조회가 가능한 것이다.
이를 사용하는 이유는 다음과 같다.
- ORM을 이용하면 데이터베이스 접근을 프로그래밍 언어의 관점으로 맞출 수 있다.
- ORM을 이용하면 객체를 통해 간접적으로 데이터베이스를 다룰 수 있다.
- ORM을 이용하면 SQL문을 모르더라도 데이터베이스를 다룰 수 있다.
등등으로 더 다양한 이유가 있지만, 이정도만 나열해보았다.
이러한 기능을 가진 개발툴이 Django에 기본 기능으로 내장되어 있다. 이 기능을 이용하면 더욱 간편하게 데이터베이스에 접근하여 개발을 진행할 수 있다. 이제부터 간단하게 Django에서 ORM을 사용하는 방법을 보여주겠다.
앞으로 진행할 실습은 python shell에서 진행하겠다. 명령어는 다음과 같다.
python manage.py shell
데이터 조회
저번 모각코 주차에 만들어놓았던 모델을 ORM 문으로 조회해보겠다. (실습을 위해 예시 데이터를 넣어놨다.)
우선 python shell에 다음과 같은 명령어를 입력해보자.
from myapp.models import Video, Clip
모델에 접근해야 하기에 우선 Video 모델을 import 해준다. 그 이후 다음 명령어를 입력해보자.
videos = Video.objects.all()
clips = Clip.objects.all()
print(videos)
print(clips)
그럼 이러한 결과값을 볼 수 있다.
Django에서 제공하는 ORM에서 모델에 대한 모든 데이터를 조회하는 명령어는 Model.objects.all() 이다. 이 명령어를 입력하면 모델에 오브젝트들이 리턴되고 출력해보면 QuerySet으로 값을 확인할 수 있다.
이번엔 다음 명령어를 입력해보자.
clip1 = Clip.objects.get(id=1)
print(clip1)
결과값을 보면 Clip 오브젝트 하나가 출력된 것을 볼 수 있다. Model.objects.get() 명령어는 모델의 많은 오브젝트 중 하나의 오브젝트만 가져올 때 사용하는 명령어이다. Model.objects.all() 명령어와 다른 점은 모든 오브젝트가 아닌 하나의 오브젝트만 가져온다는 점과 QuerySet으로 결과값이 리턴되지 않고 바로 오브젝트로 리턴된다는 것이다.
이렇게 리턴된 오브젝트를 가지고 그 안에 데이터를 볼 수도 있고, 데이터를 변경할 수도 있다. 예를 들어 clip 모델에 있는 필드 중 하나인 checkpoint1 에 데이터를 확인해보자.
print(clip1.checkpoint1)
이런 식으로 object.fieldname 형식으로 데이터를 확인할 수 있다.
데이터 생성
이번에는 데이터를 생성해보자. (video1에는 Video object가 담겨있다.)
Clip.objects.create(video=video1, checkpoint1=1, checkpoint2=2)
데이터를 생성하는 명령어는 Model.objects.create() 이다. 이렇게 데이터를 생성한 후, 데이터베이스를 확인해보면
데이터가 잘 생성된 것을 볼 수 있다.
데이터 업데이트
이번에는 데이터를 변경해보자.
clip1.checkpoint1 = 2
print(clip1.checkpoint1)
이렇게 변경된 것을 확인할 수 있다. 실제로 데이터가 바뀌었는지 확인해보자.
사진을 보면 데이터가 바뀌지 않을 것을 볼 수 있다. 이상하다. 분명 shell에서 명령어를 입력했을 때 checkpoint1에 값이 바뀐 것을 볼 수 있다. 왜 그럴까? 그것은 ORM 명령어를 사용해서 데이터베이스에 Update를 안해줬기 때문이다. ORM으로 데이터 저장을 하는 방법은 object.save()이다. 그럼 시도해보자.
clip1.checkpoint1 = 2
clip1.save()
print(clip1.checkpoint)
이렇게 바뀐 데이터가 저장된 것을 볼 수 있다.
데이터 삭제
이번에는 데이터를 삭제해보자.
clip1 = Clip.objects.get(id=1)
clip1.delete()
이렇게 id가 1인 Clip이 삭제된 것을 볼 수 있다. 그리고 같은 방식이긴 하지만 조금 더 코드가 줄일 수 있는 방법이 있다.
clip2 = Clip.objects.get(id=2).delete()
print(clip2)
Object.delete() ORM 명령어를 Objects.get() 명령어에 같이 붙힐 수 있다. 리턴 값으로 삭제된 오브젝트의 id값과 내용이 담긴 튜플을 받아온다.
데이터 필터링
데이터를 조회하는 방법으로 위에서는 get과 all을 사용해보았다. 그러나 get은 값을 하나만 가져올 수 있고, all은 모든 값만 가져올 수 있기 때문에 이번에는 내가 원하는 오브젝트만 필터링하는 방법을 알아보겠다.
1. Filter
clips_video1 = Clip.objects.filter(video=2)
필터링 명령어는 Model.objects.filter() 이다. 그 이후 인자값으로 필터링할 데이터의 조건을 넣어주면 된다. 지금 코드는 video 값이 2인 Clip 오브젝트를 가져와라 라는 뜻에 코드가 된다.
clips_video2_checkpoint50 = Clip.objects.filter(video=2, checkpoint=50)
이런 식으로 조건을 2개 이상으로 넣어 다중 필터링도 가능하다.
2. Exclude
clips_exclude_id20 = Clip.objects.exclude(id=20)
filter가 어떠한 조건에 부합하는 오브젝트를 가져오는 것이라면, exclude는 어떠한 조건에 부합하지 않는 오브젝트를 가져오라는 뜻이다. 그래서 위에 코드는 id 데이터가 20이 아닌 모든 오브젝트를 가져오라는 뜻에 코드가 된다. filter와 동일하게 조건을 2개 이상으로 넣어줄 수 있다.
3. 더블 언더스코어("__")
Filter와 Exclude를 사용하여 오브젝트를 가져올 때, 생각보다 조건에 넣을 수 없는 식들이 많다. 예를들어 부등호가 있다.
clips = Clip.objects.filter(checkpoint1 > 50)
이렇게 checkpoint1에 데이터가 50 초과인 오브젝트들만 필터링한다는 의미에서 적은 것이지만
오류가 뜨는 것을 볼 수 있다. 그러면 부등호 효과를 낼 수 있는 방법이 없을까? 그때 사용하는 것이 더블 언더스코어이다.
clips = Clip.objects.filter(checkpoint1_gte = 50)
이렇게 명령어를 입력하면 우리가 원하는 결과를 얻을 수 있다.
지금 사용한 더블 언더스코어는 __gte인데 이것은 greater than or equal 이라는 뜻으로 값이 크거나 같은 경우를 조건으로 필터링한다.
그리고 다음은 다양한 더블 언더스코어 조건들이다. 명령어 형태는 Filed__{조건} 이다.
조건 | 설명 |
__contains | lt지정한 문자열을 포함하는 데이터 조회 |
__lt | 값이 작은 경우, less than |
__lte | 값이 작거나 같은 경우, less than or equal |
__gt | 값이 큰 경우, greater than |
__gte | 값이 크거나 같은 경우, greater than or equal |
__in | 주어진 리스트에 포함되는 데이터 조회 |
(출처 : https://deku.posstree.com/ko/django/orm/)
더 다양한 조건들이 있으니 필요한 조건들을 찾아보면 좋을 것 같다.
지금 나온 더블 언더스코어는 Filter 뿐만 아니라 Exclude에도 사용 가능하다.
이번 모각코 주차에서는 정말 중요한 Django ORM에 대해서 알아보았다. 모델을 만들고 그 모델에 데이터들을 잘 필터링하여야 API 개발에 더 큰 도움이 될 것이라고 느꼈다.