티스토리 뷰

일상코딩/노트

Django : ORM

코딩애벌레 2024. 3. 21. 15:45

저번 시간에 model을 다루게 되면서 DB를 맛보게 되었다. 오늘은 데이터를 가공하는 과정을 거쳐볼 것이다. admin을 통해 데이터를 생성할 수 있지만, 나중에 배우게 될 데이터 간의 관계와 호출에서 사용이 되기 때문에 기초를 잘 다룰줄 알아야 응용이 된다.


ORM (Object-Relational-Mapping)

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

: 데이터베이스 쿼리를 추상화하여 Django 개발자가 데이터 베이스와 직접 상호작용 하지 않아도 가능하도록 만듦

: 데이터베이스와의 결합도를 낮추고 개발자가 직관적이고 생산적으로 개발할 수 있도록 도움

 

django와 Database는 사용하는 언어가 다르기 때문에 소통이 불가하다

 

ORM을 통해 해석해서 django와 DB간 전달을 도와준다

 


QuerySet API

 

: Django에 내장된 ORM으로 데이터를 검색, 필터링, 정렬 및 그룹화 하는 데 사용하는 도구로 API를 사용해 SQL이 아닌 Python 코드로 데이터를 처리

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

QuerySet API 구문으로 Model과 호출을 도와주는 Manager, 명령어인 QuerySet API

 


Query 문

 

: '쿼리문을 작성한다' 라고 하며 원하는 데이터를 얻기 위해 데이터 베이스에 요청을 보낼 코드를 작성

: 파이썬으로 작성한 코드가 ORM에 의해 SQL에서 해석되는 언어로 변환되어 데이터베이스에 전달, 데이터베이스의 응답 데이터를 ORM이 QuerySet이라는 자료 형태로 변환하여 반환

Query문 Article.objects.all()을 통해 데이터를 얻어오는 과정 = QuerySet API 구문 동작 과정 예시


QuerySet

 

: 데이터베이스에서 전달 받은 객체 목록(데이터 모음)

 - > 순회가 가능한 데이터로써 1개 이상의 데이터를 불러와 사용할 수 있음

: Django ORM을 통해 만들어진 자료형

단, 데이터베이스가 단일 객체를 반환 할 때는 QuerySet이 아닌 모델(Class)의 인스턴스로 반환



QuerySet API 실습 사전 준비

 

django에 속해있지만 기본으로 제공되지 않기 때문에 외부 라이브러리를 설치해준다
설치시에 작성한 것은 ' - '이고 settings.py에 작성하는것은 ' _ ' 이다

 

새로운 라이브러리를 설치했다면 반드시 해야하는 과정은 pip freeze > requirements.txt 로 설치 라이브러리 목록을 갱신해주기!

 


Django shell

 

: Django 환경 안에서 실행되는 python shell

Django shell 실행 명령어로 콘솔창 >>> 이 실행되면서 shell_plus 환경에 들어갈 수 있다

 

+ 추가 라이브러리

ipython 외부 라이브러리 설치

 

shell 환경에서 도움되는 자동 완성 기능을 사용하기 위해서다. 물론 다른 기능을 갖고 있지만, 주로 사용하게 될 것은 자동 완성 기능이다


CRUD 중 Create 과정

데이터 객체를 생성하는 3가지 방법

첫번째 : model class를 호출하여 비어있는 model instance를 생성하고 데이터를 채워넣는 방식

 

 

article 인스턴스 변수에 값들을 할당하고 호출해도 여전히 None 반환

 

article에 데이터를 채워넣어도 최종저장 상태가 아닌 임시 저장인 상태다. 따라서 save 함수를 사용해서 저장을 명시해주어야 저장이 된다.

저장을 하고나니 Article 객체가 생성된 것을 확인할 수 있다
database에서도 저장이 된 것을 확인할 수 있다

 

여기서 주의해야할 점은 데이터 베이스에 저장이 되었다고해서 같은 article 변수로 객체 저장을 하게되면 앞의 데이터를 덮어진다. 이 경우 shell_plus 환경을 종료한 후에 다시 접근하거나, 다른 저장방식을 사용, article_2 변수 등 다른 방법을 사용해서 추가 저장을 진행해 줄 수 있다.

단일 객체 데이터 호출 시 primary key를 이용해 해당 값과 일치하는 데이터를 호출
created_at 과 updated_at은 자동으로 데이터가 채워짐을 확인(Auto_add)


 

두번째 : 인스턴스를 할당하지 않고 바로 데이터 삽입

 

첫번째와 과정은 거의 동일하다.

첫번째 방법보다 가독성?명시도?가 살짝 떨어지지만 한줄로 데이터를 넣어줄 수 있다, 쿼리set 데이터도 2개 변경되었다
DB에 잘 반영된 것까지 확인할 수 있다


 

세번째 : 앞서 두가지 방법과 달리 데이터 생성과 저장을 동시에 진행하는 방법

 

save함수 대신 create함수를 통해 데이터를 바로 생성할 수 있다.

생성과 동시에 객체를 반환한다
데이터도 올바르게 저장된 모습

 

그러면 가장 편한 방법인 create를 쓰면 될까? 괜히 3가지를 배운게 아니다. 정답은 상황에 따라 다르다. 단순히 데이터를 생성하는 것이라면 세번째 방식을 채택하면 된다. 하지만 생각해보자

게시글에 포함될 수 없는 내용이나 올바른 호출인지 확인해야 한다

 

생성과 동시에 데이터에 저장이 되어버린다면 해당 객체가 올바른 객체인지 확인할 수 있는 타이밍이 없다. 앞서 첫번째, 두번째는 save함수 직전 임시저장을 통해 데이터를 검증할 수 있는 타이밍이 생기게 된다. 따라서 첫번째 혹은 두번째 방법이 권장된다.


CRUD 중 Read 과정

 

대표적인 조회 method는 3가지로 전체 조회(all), 특정 조건 조회(filter), 단일 데이터 조회(get)이 있다

 

  • all() : 전체 데이터를 조회하며 새로운 QuerySet 반환 데이터가 있다

가장 많이쓰는 조회

 

  • filter() : 특정 조건 데이터를 조회하며 새로운 QuerySet 반환 데이터가 있다

제목이 같은 데이터를 만들어주고 filter로 호출하면 해당 데이터를 갖고있는 객체들이 모두 query set 데이터로 전달된다

 

  • get() : 단일 데이터를 조회하며 QuerySet이 아닌 객체를 반환한다

앞서 primary key로 조회하는 것을 몇번 했으니 익숙하다

 

하지만 이전에 title이 'second'인 데이터를 조회하면 어떻게 될까? 가장 먼저 나오는 데이터가 출력 될까?

굉장히 길게 오류 메세지가 전달되는데, MultipleObjectsReturned 오류가 발생한다

 

이번에는 없는 데이터를 조회해보자.

존재하지 않는 데이터를 조회하면 DoesNotExist 오류가 발생한다

 

이러한 오류를 피하기 위해 primary key 와 같이 고유성(uniqueness)을 보장하는 조회 방식을 사용해야만 한다


CRUD 중 UPDATE 과정

 

데이터 수정은 간단하다. 데이터에 접근하고 인스턴스 변수를 직접 해주면 된다.

 

objects 매니저를 통해 get메서드로 pk=4인 데이터를 article에 할당하고 문자열 재할당

 

당연히 save() 까지 해주어야 데이터 베이스에 반영되므로 저장 후 확인해보면

저장 후 데이터 조회시 정상적으로 반영되어있다.


CRUD Delete 과정

 

항상 CRUD 중 가장 쉬운 것은 Delete인 것 같다. Update와 동일하게 인스턴스를 조회하고 delete() 함수를 실행시켜주면 삭제가 된다.

데이터를 조회 / 삭제 / 확인

 

전체 쿼리셋을 불러들어오면 객체 1번이 삭제된 것을 확인할 수 있다.

Database에서도 pk(id) = 1인 데이터가 삭제되었다

이후에 데이터를 조회하면?

DoesNotExist 오류가 발생한다

 

이후에 데이터를 생성하면 pk=1로 채워질까 아니면 pk=5로 생성될까? 모르면 해보는게 답이다.

create로 빠르게 다섯번째 객체 생성!
결과로 pk(id) = 5인 새로운 데이터로 생성된 것을 확인할 수 있다


이렇게 ORM, QuerySet API로 데이터를 CRUD 하는 방법을 알아봤다. 사실 처음 배울때는 굉장히 복잡하고 어지러운데 복습을 하다보면 한번에 혈이 뚫리는 기분이다. 조금만 더 힘내보자.

728x90

'일상코딩 > 노트' 카테고리의 다른 글

Django : Authentication system 2  (0) 2024.04.01
Django : Authentication system 1  (0) 2024.03.29
Django : Model  (0) 2024.03.20
Django : URLs  (0) 2024.03.20
Django : Form Data  (0) 2024.03.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함