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
💡 장점
- SQL을 잘 알지못해도 DB 조작 가능!
- SQL을 알아도 기존의 복잡한 쿼리문 작성없이 객체 지향적인 접근 가능!
- SQL을 잘사용하지 못한다면 ORM이 변환해주는 것이 더 빠름!
- 생산성 말해뭐해! </aside>
💡 단점
- ORM에서 지원하지 않는 쿼리라면 직접 작성해야함
- 서비스가 커질수록 ORM만으로는 한계가 있을 수 있음
- 매우 효율적인 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 프로젝트 환경이 필요
사전 셋팅
그냥 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'가 포함된
...
- 일치하지 않는다면 빈 쿼리셋을 리턴합니다.
수정
- 수정하기는 아래의 단계를 따름
- 수정할 객체를 조회
- 수정할 내용을 입력
- 수정한 것을 데이터베이스에 반영
article = Article.objects.get(id=1)
article.title = 'updated title'
article.save()
삭제
article = Article.objects.get(id=2)
article.delete()
'Django' 카테고리의 다른 글
Django MTV 사용하기 (RUD) (0) | 2024.08.14 |
---|---|
Django MTV 사용하기(CR, DB 조회 역순, CSRF) (0) | 2024.08.14 |
모델 및 마이그레이션 (0) | 2024.08.14 |
url 변수, 앱 분리, Naming URL Patterns(장고) (0) | 2024.08.13 |
Django GET 메서드 기초 (0) | 2024.08.12 |