[Django] ORM

Yujin·2023년 10월 4일
0
post-thumbnail

ORM

ORM (Object Relational Mapping)

  • 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 기술

QuerySet API

  • ORM에서 데이터를 검색, 필터링, 정렬 및 그룹화 하는 데 사용하는 도구
  • API를 사용하여 SQL이 아닌 Python 코드로 데이터를 처리

Query

  • 데이터베이스에 특정한 데이터를 보여달라는 요청
  • ‘쿼리문을 작성한다’ : 원하는 데이터를 얻기 위해 데이터베이스에 요청을 보낼 코드를 작성한다.
  • Python으로 작성한 코드가 ORM에 의해 SQL로 변환되어 데이터베이스에 전달되며, 데이터베이스의 응답 데이터를 ORM이 QuerySet이라는 자료 형태로 변환하여 전달

QuerySet

  • 데이터베이스에서 전달받은 객체 목록 (데이터 모음)
  • 순회 가능한 데이터로서, 1개 이상의 데이터를 불러와서 사용할 수 있음
  • Django ORM을 통해 만들어진 자료형
  • 단, 데이터베이스가 “단일”한 객체를 반환할 때는 QuerySet이 아닌 모델(Class)의 인스턴스로 반환됨

데이터 객체를 생성하는 방법 (Create)

save() : 객체를 데이터베이스에 저장하는 메서드

  1. 방법 1
    • save 하지 않으면 DB에 값이 저장되지 않는다.
article = Article()
article.title = 'first'
article.content = 'django!'
article.save()

Article.objects.all() 
  1. 방법 2
    • save 하지 않으면 DB에 값이 저장되지 않는다.
article = Article(title='second', content='django!')
article.save()
  1. 방법 3
    • save 필요 X
Article.objects.create(title='third', content='django!')

Read

  • all() : 전체 데이터 조회
  • get() : 단일 데이터 조회
    • 객체를 찾을 수 없을 경우 DoesNotExist 예외를 발생
    • 둘 이상의 객체를 찾을 경우 MultipleObjectsReturned 예외를 발생
    • 따라서 primary key와 같이 고유성을 보장하는 조회에서 사용
  • filter() : 특정 조건 데이터 조회

Update

  • 조회 후 변경
# 수정할 인스턴스 조회
>>> article = Article.objects.get(pk=1)

# 인스턴스 변수를 변경
>>> article.title = 'byebye'

# 저장
article.save()

# 정상적으로 변경된 것을 확인
>>> article.title
'byebye'

Delete

  • 조회 후 삭제
# 삭제할 인스턴스 조회
>>> article = Article.objects.get(pk=1)

# delete 메서드 호출 (삭제된 객체가 반환)
>>> article.delete()
(1, {'articles.Article' : 1})

# 삭제한 데이터는 더 이상 조회 불가
>>> Article.objects.get(pk=1)
DoesNotExist: Article matching query does not exist.

ORM, QuerySet API를 사용하는 이유

  • 데이터베이스 쿼리를 추상화하여 Django 개발자가 데이터베이스와 직접 상호작용하지 않도록 함
  • 데이터베이스와의 결합도를 낮추고, 개발자가 더욱 직관적이고 생산적으로 개발할 수 있도록 도움

0개의 댓글