1. ORM
1-1. Object-Relational-Mapping 객체 관계형 매핑
- 파이썬으로 데이터베이스를 조작할 수 있게 해줌
- 객체 지향 언어에서는 클래스를 이용한 객체로 데이터와 기능을 캡슐화해서 다루고, 데이터베이스는 테이블과 행으로 데이터를 저장하고 관리하는데, 이 두가지 사이의 개념적인 간극을 줄인것
- SQL 안쓰고 Python으로 데이터베이스 조작하는 방법
- SQL Statement ↔ ORM ↔ Python Object
1-2. ORM 종류
- Python - Django ORM, SQLAlchemy, Tortoise ORM …
- JAVA - JPA, Hybernate …
- Node.js - Sequalize …
1-3. ORM 장점
- SQL을 잘 알지못해도 DB 조작 가능
- SQL을 알아도 기존의 복잡한 쿼리문 작성없이 객체 지향적인 접근 가능
- SQL을 잘사용하지 못한다면 ORM이 변환해주는 것이 더 빠름
- 생산성
1-4. ORM 단점
- ORM에서 지원하지 않는 쿼리라면 직접 작성해야함
- 서비스가 커질수록 ORM만으로는 한계가 있을 수 있음
- 매우 효율적인 SQL을 작성하고 싶다면 ORM이 불편할 수 있음
2. Database API
2-1. database api
- database-abstraction API 라고도 함
- Django ORM으로 Database API를 사용해서 데이터베이스를 조작하는 것
2-2. Manager
- 우리가 모델 클래스를 생성하면 Django는 자동적으로 CRUD 할 수 있는 Database API를 제공함.
- 그리고 집사를 한명 붙여주는데 그게 바로 Manager
- Manager 정식 이름은 Django ORM Manager이고, 우리가 작성한 모델 클래스를 이용하여 데이터 베이스 쿼리작업을 도와주는 역할을 한다.
- Manager를 이용해서 Django ORM의 Queryset API를 사용할 수 있음.
- Queryset == ORM을 사용해서 데이터베이스로부터 전달받은 객체
- 이 매니저의 기본(default)이름은 objects 이다.
- MyModel.objects.all()
- Model Class . Manager . QuerysetAPI
3. Shell
3-1. Django Shell
Django가 제공하는 여러가지 기능을 명령어로 입력해서 실행해볼 수 있는 Shell 환경
3-2. 설치
python manage.py shell # django shell
pip install django-extensions # 기본 Shell 이상의 shell_plus
pip install ipython # 자동완성, 코드색상 강조 등 Shell 기능
3-3. 등록
# settings.py
INSTALLED_APPS = [
"django_extensions",
]
3-4. 실행
python manage.py shell_plus
4. CRUD
Create, Read, Update, Delete
4-1. Create: 하나의 Article 생성
article = Article(title='second_title', content='my_content')
article.save()
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 # 생성일시
article.id # pk(id)
Article.objects.create(title='third title', content='다른방법')
# save()가 필요하지 않음
4-2. Read
전체 Article 조회하기
Article.objects.all()
하나의 Article 조회하기
Article.objects.get(id=1)
- 딱 1개의 조회가 필요할 때 사용해야 함.
- 조건에 해당하는 객체가 없다면 DoesNotExist 예외를 발생시킴 (==터진다)
- 한 개 이상의 객체가 리턴될 경우도 MulipleObjectReturned 예외를 발생시킴 (==터진다)
조건으로 조회하기
- lookup과 일치하는 객체를 모두 리턴함
- *lookup: 조건에 사용되는 매개변수
- 일치하지 않는다면 빈 쿼리셋을 리턴
Article.objects.filter(content='my_content')
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'가 포함된
...
https://docs.djangoproject.com/en/4.2/topics/db/queries/#field-lookups
Making queries | Django documentation
The web framework for perfectionists with deadlines.
docs.djangoproject.com
4-3. Update: 수정하기
article = Article.objects.get(id=1)
article.title = 'updated title'
article.save()
- 수정할 객체를 조회
- 수정할 내용을 입력
- 수정한 것을 데이터베이스에 반영
4-4. Delete: 삭제하기
article = Article.objects.get(id=2)
article.delete()