본문 바로가기
Django

05_Django ORM

by MeaninGood 2022. 9. 17.

1. ORM?

  • Object-Relational-Mapping
  • 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에(Django - SQL) 데이터를 변환하는 프로그래밍 기술
  • OOP 프로그래밍에서 RDBMS을 연동할 때, 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는데이터를 변환하는 프로그래밍 기법
  • Django는 내장 Django ORM을 사용함

 

 

DB를 객체(Object)로 조작하기 위해 ORM을 사용한다

from django.db import models

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=10)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

 

2. Migrations

  • django가 Model에 생긴 변화를 반영하는 방법

 

Migrations Commands

  1. makemigrations
  • model을 변경한 것에 기반한 새로운 마이그레이션(일종의 설계도)을 만들 때 사용
  1. migrate
  • 마이그레이션을 DB에 반영하기 위해 사용
  • 설계도를 실제 DB에 반영하는 과정
  • 모델에서의 변경 사항들과 DB의 스키마가 동기화를 이룸
  1. sqlmigrate
  • 마이그레이션에 대한 SQL 구문을 보기 위해 사용
  • 마이그레이션이 SQL문으로 어떻게 해석되어서 동작할지 미리 확인할 수 있음
  1. showmigrations
  • 프로젝트 전체의 마이그레이션 상태를 확인하기 위해 사용
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py sqlmigrate {app_label} {migration_name}

 

 

 

3. DB API

  • DB를 조작하기 위한 도구
  • Django가 기본적으로 ORM을 제공함에 따라 DB를 편하게 조작할 수 있도록 도움
  • Model을 만들면 Django는 객체들을 만들고 읽고 수정하고 지울 수 있는(CRUD) database-abstract API를 자동으로 만듬
  • database-abstract API 혹은 database-access API

  • Manager
    - Django 모델에 데이터베이스 query 작업이 제공되는 인터페이스
    - 기본적으로 모든 django 모델 클래스에 objects라는 Manager 추가

 

  1. QuerySet
    - 데이터베이스로부터 전달받은 객체 목록
    - queryset 안의 객체는 0개, 1개, 혹은 여러 개일 수 있음
    - 데이터베이스로부터 조회, 필터, 정렬 등을 수행할 수 있음

    {Class Name}.{Manager}.{QuerySet API}
    Article.objects.all()

 

 

 

4. Django shell

  • 일반 Python shell을 통해서는 장고 프로젝트 환경에 접근할 수 없음
  • 장고 프로젝트 설정이 load된 Python shell을 활용해 DB API 구문 테스트 진행
  • 기본 Django shell보다 더 많은 기능을 제공하는 shell_plus를 사용해서 진행
$ pip install ipython
$ pip install django-extensions
# settings.py

INSTALLED_APPS = [
    ...,
    'django_extensions',
]
$ python manage.py shell_plus

 

 

 

5. CRUD

1) CREATE

  1. save()
  • 객체를 데이터베이스에 저장
  • 데이터 생성 시 save()를 호출하기 전에는 객체의 ID 값이 무엇인지 알 수 없음 -> ID값은 Django가 아니라 DB에서 계산되기 때문

사용법 1) article = Article()

In [1]: Article.objects.all()
Out[1]: <QuerySet []>

In [5]: article = Article()

In [6]: article
Out[6]: <Article: Article object (None)>

In [9]: article.title = 'django'

In [12]: article.content = 'first'

In [15]: article.save()

In [16]: Article.objects.all()
Out[16]: <QuerySet [<Article: Article object (1)>]>

In [17]: article
Out[17]: <Article: Article object (1)>

 

사용법 2) article = Article(title="", content="")

In [18]: article2 = Article(title='django', content='second')

In [20]: article2.save()

 

사용법 3) article = Article.objects.create(title="", content="")

In [21]: article3 = Article.objects.create(title='django', content='third')

In [22]: article3
Out[22]: <Article: Article object (3)>

 

 

 

2) READ

  • QuerySet API method를 사용해 다양한 조회를 하는 것이 중요
  1. all() : 현재 QuerySet의 복사본을 반환
Article.objects.all()

 

  1. get() : 주어진 lookup 매개변수와 일치하는 객체를 반환
    - 객체를 찾을 수 없으면 DoesNotExist 예외 발생
    - 둘 이상의 객체를 찾으면 MultipleObjectsReturned 예외 발생
    - PK 등 고유성을 보장하는 조회에서 사용!
Article.objects.get(pk=100)

 

  1. fliter() : 주어진 lookup 매개변수와 일치하는 객체를 포함하는 새 QuerySet을 반환
Article.objects.filter(title='first')

 

 

 

3) UPDATE

READ -> edit -> save()

In [28]: article = Article.objects.get(pk=1)

In [30]: article.title = "장고"

In [31]: article.content = '첫번째 게시글'

In [32]: article.save()

 

 

 

4) DELETE

  • delete() : QuerySet의 모든 행에 대해 SQL 삭제 쿼리를 수행하고, 삭제된 객체 수와 객체 유형당 삭제 수가 포함된 딕셔너리를 반환

'Django' 카테고리의 다른 글

04_HTML Form  (0) 2022.03.20
03_Template & DTL  (0) 2022.03.20
02_Request & Response  (0) 2022.03.19
01_Django?  (0) 2022.03.19