Django

ORM(Django)

zhelddustmq 2024. 8. 14. 12:26

01. ORM

02. Database API

03. CRUD with Shell

04. CRUD

 

 

 

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

 - 쉽게말해 파이썬으로 데이터베이스를 조작할 수 있게 해줌

 

 - 종류

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

Django의 ORM: SQL 안쓰고 Python으로 데이터베이스 조작할 수 있음.

  • SQL Statement ↔ ORM ↔ Python Object

 

💡 장점

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

💡 단점

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

→ 현재의 개발은 생산성이 정답인 경우가 많다.

 

 

02. Database API(database-abstraction API): 쉽게말해 Django ORM으로 Database API를 사용해서 데이터베이스를 조작하는 것

 

Manager

  • 우리가 모델 클래스를 생성하면 Django는 자동적으로 CRUD 할 수 있는 Database API를 제공
  • 관리해주는 것: Manager
    • 정식 이름은 Django ORM Manager. 작성한 모델 클래스를 이용하여 데이터 베이스 쿼리작업을 도와주는 역할
  • Manager를 이용해서 Django ORM의 Queryset API를 사용
    • Queryset: ORM을 사용해서 데이터베이스로부터 전달받은 객체(iterable 객체여서 for문과 index조회 가능)
  • 매니저의 기본(default)이름은 objects

기본 형태

   MyModel.objects.all()

  • Model Class.Manager.QuerysetAPI

 

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

 

  • python shell은 python 만 입력하면 됨
  • CRUD Shell
    • manage.py 도 결국에는 그 파일자체가 아니라 여러가지 환경을 열어줌
    • 즉, django 프로젝트 환경이 필요
    ==> python manage.py shell 현재 Django 프로젝트 환경을 Shell로 접근할 수 있게 해줌

사전 셋팅

그냥 Shell을 열면

  • 여기서 만약 우리가 작성한 Articles의 Article Model 클래스를 가져오고 싶다면

  • from articles.models import Article …
  • 모델이 한두개도 아니고 이런 식으로 사용하기는 너무 불편합니다.
  • 자동완성도 사용할 수 없습니다.

패키지 설치

  • django-extensions
    pip install django-extensions

    Django 기본 Shell보다 더 많은 기능이 있는 shell_plus를 제공
  • settings.py 앱 등록
"django_extensions",

  • ipython
pip install ipython
  • ipython은 python 기본 Shell에 여러가지 기능을 더한 것
  • 예를 들어 자동완성, 코드 색상 강조와 같은 기능이 있음
  • 패키지 설치하면 다음 명령어도 필요!!
pip freeze > requirements.txt

 

  • 실행
python manage.py shell_plus

 

 

 

04. CRUD

  • 사용하는 서비스의 대부분은 CRUD로 이루어져 있음
  • Create, Read, Update, Delete
  • 게시글 작성(Create) 조회(Read) 수정(Update) 삭제(Delete)
    • 대부분의 소프트웨어가 하는일입니다.

Article 데이터 생성하는 방법1

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

# pk(id)
article.id

 

Article 데이터 생성하는 방법2

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

 

(참고) __str__ 사용하기->(데이터 보기 편하게)

class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title
  • Article Object 보다 파악하기 쉬움
  • Article Class를 문자열 취급했을 때 처리하는 로직을 작성할 수 있음

 

조회

  • 전체 조회
Article.objects.all()
  • 하나만 조회
Article.objects.get(id=1)
  • 딱 1개의 조회가 필요할 때 사용
  • 조건에 해당하는 객체가 없다면 DoesNotExist 예외를 발생시킴 (서버 터진다는 소리)
  • 한 개 이상의 객체가 리턴될 경우도 MulipleObjectReturned 예외를 발생시킴 (서버 터진다는 소리)
  •  조건으로 조회
Article.objects.filter(content='my_content')
  • lookup과 일치하는 객체를 모두 리턴합니다.
    조건에 사용되는 매개변수를 lookup 이라고합니다.
    • 당연히 굉장히 다양한 lookup을 django는 제공
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'가 포함된
...
  • 일치하지 않는다면 빈 쿼리셋을 리턴합니다.

수정

  • 수정하기는 아래의 단계를 따름
    1. 수정할 객체를 조회
    2. 수정할 내용을 입력
    3. 수정한 것을 데이터베이스에 반영

article = Article.objects.get(id=1)
article.title = 'updated title'
article.save()

 

삭제

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