Skip to content

Django ORM #
Find similar titles

Structured data

Category
Programming

Django ORM #

Django란 Python 기반의 웹 프레임워크로 자세한 내용은 여기를 참고하면 된다.
ORM이란 Object-Relational Mapping의 약자로 객체(Object)와 관계형 데이터베이스(Relational Database)의 데이터를 매핑(Mapping)해주는 것을 의미한다. 객체 간의 관계를 바탕으로 SQL을 자동 생성하여 sql쿼리문 없이도 데이터베이스의 데이터를 다룰 수 있게 해준다.
데이터베이스의 테이블을 객체지향 프로그래밍에서 흔히 사용하는 객체(Class)처럼 사용할 수 있도록 해주는 기술이다.
기존 쿼리문을 작성하여 데이터베이스를 조작하는 것을 넘어서서 더 효율적이고 가독성 및 유지 보수에 적합한 코드를 만들기 위해 나온 기술이다.

예시 #

  • book 이라는 객체에서 저자의 이름이 kim 인 책 목록을 가져오고 싶을 때,

    1. SQL 쿼리문을 사용할 경우

      book_list = new list();
      sql = "SELECT book FROM library WHERE author = 'kim'";
      data = query(sql);
      while (row = data.next()){
          book = new Book();
          book.setAuthor(row.get('author'));
          book_list.add(book);
      }
      

      sql 쿼리문을 작성하고, 데이터를 가져오는 일련의 모든 과정들을 코드에 적어야 한다.

    2. ORM을 사용할 경우

      book_list = BookTable.query(author="kim")
      

    간단하게 한 줄로 원하는 객체를 가져올 수 있다.

ORM 활용 #

  1. 데이터 가져오기

    • objects.all()

      >>> Book.objects.all()
      <QuerySet [<Book: one>, <Book: two>]>
      

    Book객체에 저장된 데이터를 모두 가져올 수 있다.

    • objects.get()

      >>> Book.objects.get(author='kim')
      
  2. 데이터 추가하기

    • objects.create()

      >>> Book.objects.create(title='Developer', author='hyelyn')
      

    데이터 모델 Book객체에 정의된 title과 author 필드에 데이터를 넣어 새로운 데이터를 추가할 수 있다.

    • ()

      >>> book = Book()
      >>> book.title = 'Hyelyn Potter'
      >>> book.author = 'hyelyn'
      >>> book.save()
      
  3. 데이터 검색

    • objects.filter()

      >>> Book.objects.filter(author='heylyn')
      <Queryset [<Book: one>, <Book: two>]>
      

    filter의 반환 값을 쿼리셋(Queryset)이라는 Django ORM에서 발생한 자료형이다.
    쿼리셋은 데이터베이스에서 전달받은 객체들의 목록을 담고있다.
    리스트 구조와 같아서 리스트 사용하는 것과 같이 사용할 수 있디.

  4. 데이터 삭제

    • objects.delete()

      >>> d = Book.objects.get(title='Developer')
      >>> d.delete()
      # 삭제 완료.
      

Django ORM이 실행하는 실제 SQL 질의문 확인하는 방법 #

django ORM을 활용하여 데이터를 다루는 것이 편할 수는 있지만, 데이터에 대해 이해하고 더 잘 다루기 위해서는 SQL 질의문이 어떤 식으로 데이터를 다루는지 확인하고 ORM을 사용하면 더 효과적으로 사용할 수 있다.

django에서 SQL 질의문을 구하는 것은 간단하다.

Book이라는 모델이 있고 이 모델의 모든 행을 읽어올 때 Book.objects.all() 과 같은 코드를 작성하면 된다. 이렇게 구한 쿼리셋을 내장 함수인 querystr형태로 출력하면 SQL 질의문을 확인할 수 있다.

    >>> queryset = Book.objects.all()
    >>> str(queryset.query)
    SELECT "appname_book"."id", "appname_book"."title","appname_book"."author"
    FROM "appname_book"

Django ORM으로 연산하는 방법 #

  1. OR
    OR연산으로 여러 조건 중 하나라도 만족하는 행을 구해야 하는 경우가 있다. 예를 들어 Book 데이터베이스 중 title이 A이거나 B인 데이터를 구해야 한다면 다음과 같은 방법을 사용할 수 있다.

    • queryset_1 | queryset_2

      >>> queryset = Book.objects.filter(title="A")| Book.objects.filter(title="B")
      
    • filter(Q(<condition_1>|Q(<condition_2>)
      Q 사용 시 모듈을 import 해야 한다.

      >>> from django.db.models import Q
      >>> Book.objects.filter(Q(title="A") | Q(title="B"))
      
  2. AND
    AND 연산으로 여러 조건을 모두 만족하는 행을 구해야 하는 경우는 다음과 같은 방법으로 사용할 수 있다.

    • filter(<condition_1>, <condition_2>)

      >>> queryset = Book.objects.filter(title="A", title="B")
      
    • queryset_1 & queryset_2

      >>> queryset = Book.objects.filter(title="A") & Book.objects.filter(title="B")
      
    • filter(Q(<conditione_1>) & Q(<condition_2>))

      >>> from django.db.models import Q
      >>> queryset = Book.objects.filter(Q(title="A") & Q(title="B"))
      
  3. NOT
    Book 모델의 데이터베이스 중 title이 'A'가 아닌 데이터가 필요한 경우 다음과 같이 구할 수 있다.

    • exclude(<condition>)

      >>> queryset = Book.objects.exclude(title="A")
      
    • filter(~Q(<condition>))

      >>> from django.db.models import Q
      >>> queryset = Book.objects.filter(~Q(title="A"))
      

ORM의 장점 #

  • SQL query가 아닌 직관적인 코드로 (메소드) 데이터를 조작할 수 있어 개발자가 객체모델로 프로그래밍하는 데 집중할 수 있다.
  • 각 객체에 대한 코드를 별도로 작성하기 때문에 코드 가독성이 좋다.
  • SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 생산성이 좋다.

ORM의 단점 #

  • 프로젝트 복잡성이 커질 경우 난이도가 높아진다.
  • 잘못 구현하게 되면 속도가 저하되고 일관성이 없어질 수 있다.
  • sql 쿼리문으로 다루지 않다 보니 정확한 원리를 이해하는데 어려움이 발생할 수 있다.

참고문헌 #

  1. ORM(Object-Relational Mapping)이란?

  2. Django] ORM and Querysets](https://velog.io/@meekukin/Django-ORM-and-QuerySets) 3.[[Django ORM cookbook(https://django-orm-cookbook-ko.readthedocs.io/en/latest/index.html)

0.0.1_20210630_7_v33