카테고리 없음

[Django] 장고 ORM

kinggoddino 2024. 11. 17.

1. ORM

1-1. Object-Relational-Mapping 객체 관계형 매핑

  • 파이썬으로 데이터베이스를 조작할 수 있게 해줌
  • 객체 지향 언어에서는 클래스를 이용한 객체로 데이터와 기능을 캡슐화해서 다루고, 데이터베이스는 테이블과 행으로 데이터를 저장하고 관리하는데, 이 두가지 사이의 개념적인 간극을 줄인것
  • SQL 안쓰고 Python으로 데이터베이스 조작하는 방법
  • SQL Statement ↔ ORM ↔ Python Object

1-2. ORM 종류

  • Python - Django ORM, SQLAlchemy, Tortoise ORM …
  • JAVA - JPA, Hybernate
  • Node.js - Sequalize …

1-3. ORM 장점

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

1-4. ORM 단점

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

 

2. Database API

2-1. database api

  • database-abstraction API 라고도 함
  • Django ORM으로 Database API를 사용해서 데이터베이스를 조작하는 것

2-2. Manager

  • 우리가 모델 클래스를 생성하면 Django는 자동적으로 CRUD 할 수 있는 Database API를 제공함.
  • 그리고 집사를 한명 붙여주는데 그게 바로 Manager
    • Manager 정식 이름은 Django ORM Manager이고, 우리가 작성한 모델 클래스를 이용하여 데이터 베이스 쿼리작업을 도와주는 역할을 한다.
  • Manager를 이용해서 Django ORM의 Queryset API를 사용할 수 있음.
    • Queryset == ORM을 사용해서 데이터베이스로부터 전달받은 객체
  • 이 매니저의 기본(default)이름은 objects 이다.
  • MyModel.objects.all()
  • Model Class . Manager . QuerysetAPI

 

3. Shell

3-1. Django Shell

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

 

3-2. 설치

python manage.py shell  # django shell
pip install django-extensions  # 기본 Shell 이상의 shell_plus
pip install ipython  # 자동완성, 코드색상 강조 등 Shell 기능

 

3-3. 등록

# settings.py
INSTALLED_APPS = [
    "django_extensions",
]

 

3-4. 실행

python manage.py shell_plus

 


 

4. CRUD

Create, Read, Update, Delete

 

4-1. Create: 하나의 Article 생성

article = Article(title='second_title', content='my_content')
article.save()
article = Article()
article.title = 'first_title'
article.content = 'my_content'

# 여기에서 전체 Article을 조회해보면
Article.objects.all() # 비어있다

# save()하기전에는 저장되지 않음
article.save()

# 다시 전체 Article을 조회해보면 하나의 아티클이 있음
Article.objects.all()

# 속성 하나씩 접근하기
article.title       # 제목 
article.content     # 내용
article.create_at   # 생성일시
article.id          # pk(id)
Article.objects.create(title='third title', content='다른방법')
# save()가 필요하지 않음

 

 

4-2. Read

전체 Article 조회하기

Article.objects.all()

 

하나의 Article 조회하기

Article.objects.get(id=1)
  • 딱 1개의 조회가 필요할 때 사용해야 함.
  • 조건에 해당하는 객체가 없다면 DoesNotExist 예외를 발생시킴 (==터진다)
  • 한 개 이상의 객체가 리턴될 경우도 MulipleObjectReturned 예외를 발생시킴 (==터진다)

조건으로 조회하기

  • lookup과 일치하는 객체를 모두 리턴함
  • *lookup: 조건에 사용되는 매개변수
  • 일치하지 않는다면 빈 쿼리셋을 리턴
Article.objects.filter(content='my_content')
Article.objects.filter(id__gt=2) # 2보다 큰 id
Article.objects.filter(id__in=[1,2,3]) # 1,2,3에 속하는 id
Article.objects.filter(content__contains='my') # content에 'my'가 포함된
...

https://docs.djangoproject.com/en/4.2/topics/db/queries/#field-lookups

 

Making queries | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

 

4-3. Update: 수정하기

article = Article.objects.get(id=1)
article.title = 'updated title'
article.save()
  • 수정할 객체를 조회
  • 수정할 내용을 입력
  • 수정한 것을 데이터베이스에 반영

 

4-4. Delete: 삭제하기

article = Article.objects.get(id=2)
article.delete()