Django Model
Model
- 단일한 데이터에 대한 정보를 가짐
- 사용자가 저장하는 데이터들의 필수적인 필드들과 동작들을 포함
- 저장된 데이터베이스의 구조
- Django는 model을 통해 데이터에 접속하고 관리
- 일반적으로 각각의 model은 하난의 데이터베이스 테이블에 매핑 됨
Database
- 데이터베이스
- 쿼리
- 데이터를 조회하기 위한 명령어
- 조건에 맞는 데이터를 추출하거나 조작하는 명령여
- "Query를 날린다." -> DB를 조작한다!
Database의 기본 구조
- 스키마
- 데이터베이스에서 자료의 구조, 표현방법, 관계 등을 정의한 구조 (structure)
- 즉, 데이터베이스의 구조와 제약 조건(자료의 구조, 표현방법, 관계)에 관련한 전반적인 명세를 기술한 것
-
테이블
-
열(column) : 필드(field) or 속성
- 각 열에는 고유한 데이터 형식이 지정된다. (INTEGER, TEXT, NULL)
-
행(row) : 레코드(record) or 튜플
- 테이블의 데이터는 행에 저장된다. 즉, 근무자 테이블에 7명의 근무자 정보가 저장되어잇으며 7개의 행이 존재한다.
-
즉, 열과 행의 모델을 사용해 조직된 데이터 요소들의 집합. SQL 데이터베이스에서는 테이블을 관계라고도 한다.
- PK
- 각 행의 고유값으로 Primary Key가 있다.
- PK는 반드시 설정하여야하며, 데이터베이스 관리 및 관계 설정시 주요하게 활용된다.
- Framework를 사용하면 Model을 만들 때 자동으로 PK를 만들어주는 경우가 있다.
Model
- 웹 애플리케이션의 데이터를 구조화하고 조작하기 위한 도구
ORM
- Object-Relational-Mapping
- 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템간 (Django-SQL)데이터를 변환하는 프로그래밍 기술
- OOP 프로그래밍에서 RDBMS를 연동할 때 , 데이터베이스와 객체 지향 프로그래밍 언어간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법
- Django는 내장 Django ORM을 사용함
ORM의 장점과 단점
- 장점
- SQL을 잘 알지 못해도 DB 조작이 가능
- SQL의 절차적 접근이 아닌 객체 지향적 접근으로 인한 높은 생산성
- 단점
- ORM 만으로 완전한 서비스를 구현하기 어려운 경우가 있음
- 현대 웹 프레임워크의 요점은 웹 개발의 속도를 높이는 것
ORM 사용 이유 : DB를 객체로 조작하하기 위함
Migrations
- Django가 model에 생긴 변화를 반영하는 방법
Migrations Commands
- Migration 실행 및 DB 스키마를 다루기 위한 몇가지 명령어
- makemigrations
- model을 변경한 것에 기반한 새로운 마이그레이션(설계도)를 만들 때 사용
- migrate
- 마이그레이션을 DB에 반영하기 위해 사용
- 설계도를 실제 DB에 반영하는 과정
- 모델에서의 변경 사항들과 DB의 스키마가 동기화를 이룸
- sqlmigrate
- 마이그레이션에 대한 SQL 구문을 보기 위해 사용
- 마이그레이션이 SQL 문으로 어떻게 해석되어서 동작할지 미리 확인할 수 있음
- showmigrations
- 프로젝트 전체의 마이그레이션 상태를 확인하기 위해 사용
- 마이그레이션 파일들이 migrate 됐는지 안됐는지 여부를 확인할 수 있음
Migration 해보기
models.py 작성
class Movie(models.Model) :
title = models.CharField(max_length=10)
description = models.TextField()
- 각 모델은 django.models.Model 클래스의 서브 클래스로 표현됨
- django.db.models 모듈의 Model 클래스를 상속받음
- model 모듈을 통해 어떠한 타입의 DB 컬럼을 정의할 것인지 정의
- title과 content는 모델의 필드를 나타냄
- 각 필드는 클래스 속성으로 지정되어 있으며, 각 속성은 각 데이터베이스의 열에 매핑
모델 필드
Migrations
$ python manage.py makemigrations
- 'migrations/0001_initial.py' 생성 확인
$ python manage.py migrate
$ python manage.py sqlmigrate app_name 0001
- 해당 migrations 설계도가 SQL 문으로 어떻게 해석되어서 동작할지 미리 확인 할 수 있음
BEGIN;
--
-- Create model Movie
--
CREATE TABLE "movies_movie" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(20) NOT NULL, "description" text NOT NULL, "user_id" bigint NOT NULL REFERENCES "accounts_user" ("id") DEFERRABLE INITIALLY DEFERRED);
--
-- Create model Comment
showmigrations
python manage.py showmigrations
- migrations 설계도들이 migrate 됐는지 안됐는지 여부를 확인 할 수 있음