[Django]ORM

김예진·2020년 10월 25일
0

Django

목록 보기
3/10
post-thumbnail

1. ORM(Object-Relational Mapping)

객체(Object)와 관계형 데이터베이스(Relational Database)의 데이터를 매핑(Mapping)해주는 것을 말한다. 객체 간의 관계를 바탕으로 SQL을 자동을 생성해서 sql 쿼리문 없이도 데이터베이스의 데이터들을 다룰 수 있다.


2. shell 실행

1) 장고 shell 실행하기

python manage.py shell

위 사진과 같이 manage.py가 있는 위치에서 실행된다.

2) 필요한 모듈 import

models.py 에 만들었던 model을 import 한다.

from 앱이름.파일이름 import 모델이름

ex) from user.models import User


3. ORM - Query Set

  • Query Set이란?
    : Query 란 데이터베이스에 정보를 요청해주는 것을 의미하며 파이썬으로 작성한 코드가 sql 로 매핑되어 queryset(리스트 형태임) 이라는 자료 형태로 값이 넘어온다. 이는 순회가능한 데이터로서 이를 이용하여 1개 이상의 데이터를 불러와 사용할 수 있다.

  • Queryset의 특징
    : Lazy함(?) 미리 db 에 접근해서 값을 불러오는 것이 아니라 출력 등과 같이 필요한 순간에 sql로 매핑되고 이를 통해 db에 접근해 값을 가져온다.

1) Create : 데이터 생성하기

  • create method 사용
>>> Person.objets.create(name="김우빈", age="20", job="배우")
  • save method 사용
>>> a = Person(name="김우빈", age="20", job="배우")
>>> a.save()

2) Read : 데이터 조회하기

- get method 사용 : name이 "김우빈"인 데이터 조회하기

>>> Person.objets.get(name="김우빈")

❗️ get() 안에 조건을 제시할 수 있음
❗️ get method는 query set이 아닌 단일행(모델 타입) 결과를 반환함
❗️ 단일행 결과를 반환하므로 get() 다음에 다른 method 사용 불가
❗️ 반환되는 값이 1개 이상일 경우 에러 발생


- all method 사용 : 테이블 데이터 모두 출력

>>> Person.objects.all()

❗️ Query set 타입으로 반환됨.
❗️ dictionary 사용 방법과 동일하게 사용 가능
ex)

>>> a = Person.objects.all()
>>> print(a[0]['name']

- filter method 사용 : 조건에 맞는 데이터 출력

>>> Person.objects.filter(job="배우")
# job이 "배우인" Person table의 데이터를 출력 

❗️ objects.all().filter()와 동일한 기능 (all 생략)
❗️ Query set타입으로 반환

+) 조회 조건들



3) 참조하는 테이블이 있을 때 데이터 생성하기

  • 메뉴 테이블을 참조하는 카테고리 테이블 생성하기
>>> a = Menu.objects.get(name="음료")
# 메뉴 테이블에서 name이 "음료"인 데이터 조회 

>>> Category.objects.create(name="쉐이크", menu=a)

4) Update : 데이터 변경하기

  • 단일 업데이트 : 단일 행의 데이터 변경
>>> a = Menu.objects.get(name="음료")
>>> a.name = "drink"
# name을 "음료"에서 "drink"로 변경

>>> a.save()
  • 다중 업데이트 : 여러 행의 데이터 및 여러 컬럼이 묶여 하나의 pk를 이루는 형태의 테이블에서 데이터 변경하기
>>> a = Menu.objects.filter(name="김우빈", age="20").update(**update_dict)

ex)

>>> car = {
	"brand" : "Ford",
    	"model" : "Mustang",
        "year" : "1964"
        }
        
>>> car.update({"color" : "White"})

5) Delete : 데이터 삭제하기

  • 단일 삭제 : 단일 행의 데이터 삭제하기
>>> a = Menu.objects.get(name="김우빈")
>>> a.delete()
  • 다중 삭제 : 여러 행 및 쿼리 결과의 데이터 삭제하기
>>> a = Menu.objects.filter(name="김우빈",age="20").delete()
profile
Backend Developer 🌱 벨로그 내용을 티스토리로 이사중~!

0개의 댓글