강의명 : 파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
강의: 장고 ORM
SQL: 데이터베이스에 쿼리하기 위한 언어
직접 SQL을 만들어내기도 하지만, ORM (Object-relational mapping)을 통해 SQL을 생성/실행하기도 한다.
ORM을 쓰더라도, 작성한 ORM코드를 통해 어떤 SQL이 실행되고 있는지 파악을 해야 최적화 가능
Rleational Databases
NoSQL Databases
물론 장고에서도 다양한 ORM 라이브러리를 사용 가능. 적절하게 섞어쓸 수 있음
SQL을 직접 실행할 수도 있지만, 간으하면 ORM tkdyd
데이터베이스 테이블과 파이썬 클래스를 1:1로 매핑
모델 클래스명은 단수형으로 지정 ex: Posts (x), Post (O)
매핑되는 모델 클래스는 DB 테이블 필드내역이 일치해야 함
모델을 만들기 전에 서비스에 맞게 데이터베이스 설계가 필수
앱 폴더에 있는 models.py 파일에 아래처럼 작성하게 됨
DB 테이블명: 디폴트 “앱이름_모델명”
ex.
blog앱
shot 앱
Item 모델 정의
마이그레이션 파일 생성
python3 manage.py makemigrations 앱이름
마이그레이션 파일 적용
python3 manage.py migrate
데이터베이스 확인
#sqllite가 생성되어 있다면
python3 manage.py dbshell
인스타그램 이라는 이름의 앱 생성
python3 manage.py startapp instagram
settings.py에 앱 이름 추가
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'instagram',
]
urls.py 직접 추가
안에 다음과 같이 입력
urlpatterns = []
프로젝트 디렉토리 urls.py에 다음 한 줄 추가
instagram 디렉토리 models.py에 다음과 같이 모델 생성
from django.db import models
# Create your models here.
class Post(models.Model):
message = models.Textfield()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
python3 manage.py makemigrations instagram
오타가 있거나 하면 다음과 같은 에러가 남
AttributeError: module 'django.db.models' has no attribute 'Textfield'
혹은 settings.py에 앱을 추가안해주었거나, 추가해주고 저장을 안해주었다면 다음과 같은 에러
No installed app with label 'instagram'.
성공하면 다음과 같이 뜸
Migrations for 'instagram':
instagram/migrations/0001_initial.py
- Create model Post
다음 명령어 입력
python3 manage.py migrate instagram
아래와 같이 뜨면 models.py에 작성한대로 Post라는 테이블이 생성이 된 것
Operations to perform:
Apply all migrations: instagram
Running migrations:
Applying instagram.0001_initial... OK
python3 manage.py sqlmigrate instagram 0001_initial
아래와 같은 명령어가 입력된 것을 알 수 있음 (id는 따로 지정안해주었지만 primary key로 자동 생성되어씅ㅁ)
BEGIN;
--
-- Create model Post
--
CREATE TABLE "instagram_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "message" text NOT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
COMMIT;