TIl

ORM

아크몽 2024. 4. 1. 14:26

ORM

Object-Relational-Mapping

객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 데이터를 변환하는 기술

장고      <->        ORM   <->   DB
		Python Object          SQL

QuerySet API

ORM에서 데이터를 검색, 필터링, 정렬 및 그룹화 하는 데 사용하는 도구

= API를 사용하여 SQL이 아닌 Python 코드로 데이터를 처리

구문

Article . object . all()

Model class Manager Querytset API

Query

  • 데이터베이스에 특정한 데이터를 보여 달라는 요청
  • ‘쿼리문을 작성한다.’ : 원하는 데이터를 얻기 위해 데이터베이스에 요청을 보낼 코드를 작성한다.
  • 파이썬으로 작성한 코드가 ORM에 의해 SQL로 변환 → 데이터베이스에 전달 → 응답 데이터를 ORM이 QuerySet이라는 자료 형태로 변환하여 우리에게 전달

QuerySet

  • 데이터베이스에게서 전달 받은 객체 목록( 데이터 모음)
    • 순회가 가능한 데이터로써 1개 이상의 데이터를 불러와 사용할 수 있음
  • Django ORM을 통해 만들어진 자료형
  • 단, 데이터베이스가 단일한 객체를 반환 할 때는 QuerySet이 아닌 모델(Class)의 인스턴스로 반환됨

QuerySet API는 python의 모델 클래스와 인스턴스를 활용해 DB에 데이터를 저장, 조회, 수정, 삭제(CRUD) 하는 것

실습

pip install ipython : 파이썬 쉘을 이쁘게 보이게 해줌

pip install django-extensions : 추가적인 기능 사용하게 해줌

주의해야될 것 : django_extensions 을 settings.py 파일 >INSTALLED_APPS에 넣어줘야됨

Django shell

Django 환경 안에서 실행되는 python shell (입력하는 QuerySet API 구문이 Django 프로젝트에 영향을 미침)

python manage.py shell_plus

데이터 객체를 만드는(생성하는) 3가지 방법

  1. 첫번째 방법
# shell
article = Article()
article.title = 'first'
article.content = 'django!'
article.save()

Article.objects.all()
  1. 두 번째 방법 : 이 방법을 주로 씀
article = Article(title='second' , content = 'django!')
article.save()
  1. 세 번째 방법 : .save()가 자동으로 됨 == 좋지 않음
Article.objects.create(title='third' , content='django!')

CRUD

Read

대표적인 조회 메서드

  • Return new QuerySets
    • all() : 전체 데이터 조회
    • filter() 특정 조건 데이터 조회
  • Do not return QuerySets
    • get() : 단일 데이터 조회

get() 특징

  • 객체를 찾을 수 없으면 DoesNotExist 예외를 발생시키고, 둘 이상의 객체를 찾으면 MultipleObjectsReturned 예외를 발생시킴 ⇒ 위와 같은 특징을 가지고 있기 때문에 primary key와 같이 고유성(uniqueness)을 보장하는 조회에서 사용해야 함

Update

데이터 수정 : 인스턴스 변수를 변경 후 save 메서드 호출

# 수정할 인스턴스 조회
article = Article.objects.get(pk = 1)

# 인스턴스 변수를 변경
article.title = 'byebye'

# 저장
article.save()

delete

데이터 삭제 : 삭제하려는 데이터 조회 후 delete 메서드 호출

# 삭제할 인스턴스 조회
article = Article.objects.get(pk = 1)

# delete 메서드 호출 ( 삭제 된 객체가 반환)
article.delete()

Field lookups

  • 특정 레코드에 대한 조건을 설정하는 방법
  • QuerySet 메서드 filter(), exclude() 및 get()에 대한 키워드 인자로 지정
  • 예시)
Article.objects.filter(content__contains='dja')

왜 ORM, QuerySet API를 사용하는가?

  • 데이터베이스 쿼리를 추상화하여 Django 개발자가 데이터베이스와 직접 상호작용하지 않아도 되도록 함
  • 데이터베이스와의 결합도를 낮추고 개발자가 더욱 직관적이고 생산적으로 개발할 수 있도록 도움