ORM은
- 장고에서만 사용하는 '기능'이다.
- 파이썬 언어로 데이터 작업을 할 수 있게 하는 기능이다.
- 객체(by 클래스)와 관계형 데이터베이스의 데이터(by 테이블)를 자동으로 매핑(연결)해주는것
- 객체 모델과 관계형 모델 간의 불일치가 존재한다
- sql문을 자동으로 생성해 불일치를 해결한다.
- 데이터 모델을 생성하면 장고는 데이터베이스 api를 호출한다. 즉 장고가 데이터베이스와 클라이언트를 파이썬으로 연결해 주는 것이다.
- 사용하는 이유는 데이터베이스를 다루는것에 매우 직관적이고 간단하기때문이다.
- 파이썬으로 작성된 언어가 sql로 매핑되어 quaryset란 자료형태로 넘어온다.
장점
- SQL쿼리가 아니니 직관적인 코드로 데이터를 조작할 수 있어 개발자가 모델로 프로그래밍하는데 집중할수 있도록 도와준다.
- 부수적인 코드가 줄어든다.
- 각종 객체에 대한 코드를 별도로 작성하여 가독성을 높인다.
- 객체 지향적인 접근으로 생산성이 증가한다.
단점
- 완벽한 ORM으로만 서비스를 구현하기 어렵다.
- 사용하기는 편하지만 설계의 신중성을 요한다.
- DBMS의 고유기능을 이용하기가 어렵다.
기본지식
쿼리문
- 데이터 작업을 위한 데이터베이스 문법이다.
- 데이터베이스에 정보를 요청하는 것
쿼리문의 단점
- 같은 목적으로 작성해도 개발자마다 다양한 쿼리문이 만들어져 통일성이 깨진다.
- 개발자가 쿼리문을 잘못 작성하면 성능이 저하될 수 있다.
- 데이터베이스를 변경하면 특정 데이터베이스에 의존하는 쿼리문을 수정해야하는 유지 보수의 어려움이 있다.
BUT
- 장고의 ORM은 데이터베이스의 테이블을 모델화해 사용하여 위의 단점 모두 사라진다.
사용법
python manage.py shell
장고에서는 데이터베이스와 직접 소통하는 방법은 장고의 shell을 사용하는 것이다.
from 모델 import 클래스
무조건 import를 해와야한다.
클래스.objects~
장고의 모든 모델은 .objects(=manager())를 가지고있다.(모델을 만들면 같이 만들어진다.)
문법 : 클래스이름.objects.values()
.all() : 모든 모델을 불러온다.
.get() : 괄호안의 하나의 조건을 가진 데이터만을 반환한다. 만약 반환값이 1개 이상이라면 오류가 뜬다. 즉 결과도 하나만 나오는것이어야 한다.
.filter() : 괄호안의 조건에 따라 모델이 이미 가지고있는 속성만을 검색해준다.
.create() :
.delete() :
.save() : 저장
QuerySet
- list다.(객체는 dictionary)
- 연산자를 묶어주는 역할을 한다.
- ex) 필터 조건을 두번 주고싶다던가
- 데이터베이스에서 전달받은 객체/row(db sql)의 모음
- 리스트의 구조는 같지만 파이썬 기본 자료구조가 아니기 때문에 - 파이썬에서 읽고 쓰기 위해 자료형 변환을 줄때 사용한다.
- 미리 데이터베이스에 접근하는게 아닌, 출력등의 필요한 순간에만 매핑되어 db에 접근해 값을 가져온다.
look_up 모델
- 조회를 구현하는 일반 클래스
- 밑줄(언더스코어) 두개 문자 __
__exact : 정확히 일치
__contains : 포함하는지
__gt : 큼
__gte : 크거나 같음
__lt : 작음
__lte : 작거나 같음
__startwith : 시작하는지
__endwith : 끝나는지