반응형

ORM(Object-Relational Mapping)
- 데이터베이스의 테이블을 Python 객체처럼 다룰 수 있도록 도와주는 기술
- 편리한 데이터베이스 스키마(테이블, 컬럼 등) 생성/수정/삭제 지원
- Python을 통해 데이터를 쉽게 조회/변경할 수 있도록 지원
ORM의 장점
- SQL 직접 작성 X
- 데이터베이스 종류에 크게 의존 X
- Python 코드로 데이터를 쉽게 조회, 생성, 수정, 삭제 가능
- 데이터베이스 스키마 관리 편리
Django Shell 실행
- `python manage.py shell`
- shell: Django 프로젝트 환경이 적용된 Python 콘솔
기존 모델 참고
class Post(models.Model):
title = models.CharField(max_length=128)
body = models.CharField(max_length=1024)
author_name = models.CharField(max_length=32)
points = models.PositiveIntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.id}, {self.title}"
ORM QuerySet
- Django ORM에서 데이터를 조회하면 대부분 QuerySet 반환
- ` >>> Post.objects.all()`
- `<QuerySet [...]>`
- iterable하므로 반복 가능한 형태
- Lazy Loading(지연 로딩) 사용
- 값이나 객체의 계산을 우리가 실제로 필요할 때까지 연기하는 프로그래밍 기법
- 생성되는 즉시 SQL를 실행하지 않고 실제로 데이터가 필요할 때 쿼리 실행
QueryDict
- 요청 데이터를 담는 객체
| QuerySet | QueryDict | |
| 역할 | DB 조회 결과 | HTTP 요청 데이터 |
| 사용 위치 | ORM(Model) | View(Request) |
| 생성 주체 | Django ORM | Django Request |
| 예시 | Post.objects.filter() | request.GET, request.POST |
| 담고 있는 것 | Model 객체들 | 사용자가 보낸 데이터 |
데이터 생성(Create)/조회(Read)
$ python manage.py shell
13 objects imported automatically (use -v 2 for details).
Python 3.13.12 (tags/v3.13.12:1cbe481, Feb 3 2026, 18:22:25) [MSC v.1944 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
# Model 가져오기
>>> from post.models import Post
# 전체 게시글 조회
>>> Post.objects.all()
<QuerySet []>
# 새로운 게시글 생성
>>> new_post = Post(title="제목", body="본문", author_name="작성자")
# 결과: 데이터 없음
>>> new_post
<Post: Post object (None)>
>>> Post.objects.all()
<QuerySet []>
# 객체 생성했다고 데이터베이스에 저장되지 않음
# save()로 데이터 저장 필요
>>> new_post.save()
>>> Post.objects.all()
<QuerySet [<Post: Post object (1)>]>
# Primary Key 자동 생성 (id와 pk는 동일)
>>> new_post.id
1
>>> new_post.pk
1
# 저장 전에는 id(pk) 존재하지 않음
# save()가 실행되는 순간 데이터베이스에서 발급
>>> new_post_2 = Post(title="제목2", body="본문2", author_name="작성자2")
>>> new_post_2.id
>>> new_post_2.id is None
True
ORM 데이터 수정(Update)
$ python manage.py shell
13 objects imported automatically (use -v 2 for details).
Python 3.13.12 (tags/v3.13.12:1cbe481, Feb 3 2026, 18:22:25) [MSC v.1944 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from post.models import Post
>>> Post.objects.all()
<QuerySet [<Post: 1, 제목>]>
>>> Post.objects.all()[0]
<Post: 1, 제목>
# 조건에 맞는 데이터 조회
>>> Post.objects.get(id=1)
<Post: 1, 제목>
>>> post = Post.objects.get(id=1)
>>> post
<Post: 1, 제목>
# 데이터 수정
>>> post.title
'제목'
>>> post.title="새로운 제목"
>>> post.title
'새로운 제목'
>>> post.save()
>>> post = Post.objects.get(id=1)
>>> post.title
'새로운 제목'
>>> post
<Post: 1, 새로운 제목>
# 자동 생성된 값 확인
>>> post.points
0
>>> post.created_at
datetime.datetime(2026, 5, 30, 19, 25, 35, 223307, tzinfo=datetime.timezone.utc)
ORM 데이터 조회(filter)
- 조건에 맞는 데이터를 조회할 때 사용
- Post.objects.filter(title="새로운 제목")
- `startswith`: 특정 문자열로 시작하는 조회
- Post.objects.filter(title__startswith="새")
- `lt`: Less Than, 미만
- Post.objects.filter(points__lt=10)
- `gte`: Greater Than or Equal, 이상
- Post.objects.filter(points__gte=10)
-
get()과 filter()의 차이
- `get()`: 조건에 맞는 데이터를 하나만 조회
- `post = Post.objects.get(id=1)`
- 객체(Object) 반환
- 조건에 맞는 데이터가 반드시 1개여야 함(2개 이상이면 예외 발생)
- 데이터가 없으면 예외 발생(DoesNotExist)
- 즉시 쿼리 실행
- `filter()`: 조건에 맞는 데이터를 조회
- QuerySet 반환
- 데이터가 여러 개여도 가능
- 데이터가 없어도 예외 발생 X
- Lazy Loading
ORM 데이터 삭제(Delete)
- `post.delete()`
- 조건에 맞는 데이터 여러 개 삭제: `Post.objects.filter(title="제목").delete()`
ORM과 SQL 비교
| ORM | SQL |
| Post.objects.all() | SELECT * FROM post |
| Post.objects.get(id=1) | SELECT * FROM post WHERE id=1 |
| Post.objects.filter(title="제목") | SELECT * FROM post WHERE title='제목' |
| post.save() | INSERT 또는 UPDATE |
| post.delete() | DELETE FROM post |
[참고] 실전! Django 입문 강의
반응형