본문 바로가기

웹 개발

[Django] Django ORM

ORM(Object-Relational-Mapping)

쉽게 말하면 파이썬으로 데이터베이스를 조작할 수 있게 해준다는 것이고

면접식으로 말하면 객체 지향 언어에서는 클래스를 이용한 객체로 데이터와 기능을 캡슐화해서 다루고 데이터베이스는 테이블과 행으로 데이터를 저장하고 관리하는데 이 두가지 사이의 개념적인 간극을 줄인것이다.

ORM은 Django에만 있는것이 아니라 여러 가지가 존재한다.(궁금하면 구글링)

 

ORM의 장단점

장점

  1. SQL을 잘 알지못해도 DB 조작이 가능하다
  2. SQL을 알아도 기존의 복잡한 쿼리문 작성없이 객체 지향적인 접근이 가능하다.
  3. SQL을 잘사용하지 못한다면 ORM이 변환해주는 것이 더 빠르다.
  4. 이 모든것이 생산성이 좋다는 것이다.

단점

  1. ORM에서 지원하지 않는 쿼리라면 직접 작성해야한다.
  2. 서비스가 커질수록 ORM만으로는 한계가 있을 수 있다.
  3. 매우 효율적인 SQL을 작성하고 싶다면 ORM이 불편할 수 있다.

Database API

우리가 모델 클래스를 생성하면 Django는 자동적으로 CRUD 할 수 있는 Database API를 제공한다.

Django ORM으로 Database API를 사용해서 데이터베이스를 조작하는 과정에서 우리가 작성한 모델 클래스를 이용하여 데이터 베이스 쿼리작업을 도와주는 Manager를 얻게 되는데 이 Manager의 기본 이름은 objects다.

우리는 앞으로 Manager를 이용해서 Django ORM의 Queryset API를 사용하게 될 것이다.

※ Queryset == ORM을 사용해서 데이터베이스로부터 전달받은 객체

기본 형태 : MyModel.objects.all()

 

Django shell

Django가 제공하는 여러가지 기능을 명령어로 입력해서 실행해볼 수 있는 Shell 환경이다.

하지만 Django가 기본적으로 제공하는 shell 환경은 사용하기 너무 불편한 점이 있어서

pip install django-extensions

을 설치하면 Django 기본 Shell보다 더 많은 기능이 있는 shell_plus를 제공받을 수 있다.

그리고 나서 INSTALLED_APPS에 "django_extensions", 을 추가해주면 된다.

pip install ipython

ipython은 python 기본 Shell에 여러가지 기능을 더한것으로 자동완성, 코드 색상 강조와 같은 기능을 제공한다.

같이 깔면 훨씬 편해지니까 같이 설치해주도록 하자.  pip freeze > requirements.txt 도 잊지 말자.

 

CRUD

우리가 사용하는 서비스의 대부분이 CRUD로 이루어져 있는데, CRUD는 Create, Read, Update, Delete의 약자로

게시글을 작성하고(Create) 조회하고(Read) 수정하고(Update) 삭제하는(Delete) 대부분의 소프트웨어가 하는일을 말한다.

# Article 생성 방법 1
article = Article()
article.title = 'first_title'
article.content = 'my_content'
article.save()

# Article 생성 방법 2
article = Article(title='second_title', content='my_content')
article.save()

# Article 생성 방법 3(save()가 필요하지 않음)
Article.objects.create(title='third title', content='마지막 방법임')

# 모든 Article 조회
Article.objects.all()

# 하나의 Article 조회(아이디가 1인)
Article.objects.get(id=1)

# 조건에 맞는 Article 조회('my_content'가 포함된)
Article.objects.filter(content='my_content')

# Article 수정하기
article = Article.objects.get(id=1)
article.title = 'updated title'
article.save()

# Article 삭제하기
article = Article.objects.get(id=2)
article.delete()