1. ORM?
- Object-Relational-Mapping
- 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에(Django - SQL) 데이터를 변환하는 프로그래밍 기술
- OOP 프로그래밍에서 RDBMS을 연동할 때, 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는데이터를 변환하는 프로그래밍 기법
- Django는 내장 Django ORM을 사용함
DB를 객체(Object)로 조작하기 위해 ORM을 사용한다
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=10)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
2. Migrations
- django가 Model에 생긴 변화를 반영하는 방법
Migrations Commands
- makemigrations
- model을 변경한 것에 기반한 새로운 마이그레이션(일종의 설계도)을 만들 때 사용
- migrate
- 마이그레이션을 DB에 반영하기 위해 사용
- 설계도를 실제 DB에 반영하는 과정
- 모델에서의 변경 사항들과 DB의 스키마가 동기화를 이룸
- sqlmigrate
- 마이그레이션에 대한 SQL 구문을 보기 위해 사용
- 마이그레이션이 SQL문으로 어떻게 해석되어서 동작할지 미리 확인할 수 있음
- showmigrations
- 프로젝트 전체의 마이그레이션 상태를 확인하기 위해 사용
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py sqlmigrate {app_label} {migration_name}
3. DB API
- DB를 조작하기 위한 도구
- Django가 기본적으로 ORM을 제공함에 따라 DB를 편하게 조작할 수 있도록 도움
- Model을 만들면 Django는 객체들을 만들고 읽고 수정하고 지울 수 있는(CRUD) database-abstract API를 자동으로 만듬
database-abstract API
혹은database-access API
- Manager
- Django 모델에 데이터베이스 query 작업이 제공되는 인터페이스
- 기본적으로 모든 django 모델 클래스에 objects라는 Manager 추가
- QuerySet
- 데이터베이스로부터 전달받은 객체 목록
- queryset 안의 객체는 0개, 1개, 혹은 여러 개일 수 있음
- 데이터베이스로부터 조회, 필터, 정렬 등을 수행할 수 있음{Class Name}.{Manager}.{QuerySet API}
Article.objects.all()
4. Django shell
- 일반 Python shell을 통해서는 장고 프로젝트 환경에 접근할 수 없음
- 장고 프로젝트 설정이 load된 Python shell을 활용해 DB API 구문 테스트 진행
- 기본 Django shell보다 더 많은 기능을 제공하는 shell_plus를 사용해서 진행
$ pip install ipython
$ pip install django-extensions
# settings.py
INSTALLED_APPS = [
...,
'django_extensions',
]
$ python manage.py shell_plus
5. CRUD
1) CREATE
save()
- 객체를 데이터베이스에 저장
- 데이터 생성 시 save()를 호출하기 전에는 객체의 ID 값이 무엇인지 알 수 없음 -> ID값은 Django가 아니라 DB에서 계산되기 때문
사용법 1) article = Article()
In [1]: Article.objects.all()
Out[1]: <QuerySet []>
In [5]: article = Article()
In [6]: article
Out[6]: <Article: Article object (None)>
In [9]: article.title = 'django'
In [12]: article.content = 'first'
In [15]: article.save()
In [16]: Article.objects.all()
Out[16]: <QuerySet [<Article: Article object (1)>]>
In [17]: article
Out[17]: <Article: Article object (1)>
사용법 2) article = Article(title="", content="")
In [18]: article2 = Article(title='django', content='second')
In [20]: article2.save()
사용법 3) article = Article.objects.create(title="", content="")
In [21]: article3 = Article.objects.create(title='django', content='third')
In [22]: article3
Out[22]: <Article: Article object (3)>
2) READ
- QuerySet API method를 사용해 다양한 조회를 하는 것이 중요
all()
: 현재 QuerySet의 복사본을 반환
Article.objects.all()
get()
: 주어진 lookup 매개변수와 일치하는 객체를 반환
- 객체를 찾을 수 없으면 DoesNotExist 예외 발생
- 둘 이상의 객체를 찾으면 MultipleObjectsReturned 예외 발생
- PK 등 고유성을 보장하는 조회에서 사용!
Article.objects.get(pk=100)
fliter()
: 주어진 lookup 매개변수와 일치하는 객체를 포함하는 새 QuerySet을 반환
Article.objects.filter(title='first')
3) UPDATE
READ -> edit -> save()
In [28]: article = Article.objects.get(pk=1)
In [30]: article.title = "장고"
In [31]: article.content = '첫번째 게시글'
In [32]: article.save()
4) DELETE
delete()
: QuerySet의 모든 행에 대해 SQL 삭제 쿼리를 수행하고, 삭제된 객체 수와 객체 유형당 삭제 수가 포함된 딕셔너리를 반환
'Django' 카테고리의 다른 글
04_HTML Form (0) | 2022.03.20 |
---|---|
03_Template & DTL (0) | 2022.03.20 |
02_Request & Response (0) | 2022.03.19 |
01_Django? (0) | 2022.03.19 |