Django 모델 (ORM)
강의 내용 정리
강의명 : 파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
강의: 장고 ORM
데이터베이스와 SQL
SQL: 데이터베이스에 쿼리하기 위한 언어
직접 SQL을 만들어내기도 하지만, ORM (Object-relational mapping)을 통해 SQL을 생성/실행하기도 한다.
ORM을 쓰더라도, 작성한 ORM코드를 통해 어떤 SQL이 실행되고 있는지 파악을 해야 최적화 가능
- django-debug-toolbar 적극 활용
장고 ORM인 모델은 RDB만을 지원
다양한 파이썬 ORM
Rleational Databases
- django databases, sqlalchemy, orator, peewee, ponyORM 등
NoSQL Databases
- django-mongodb-engine, hot-redis, MongoEngine, PynamoDB 등
장고의 강점은 Model과 Form
물론 장고에서도 다양한 ORM 라이브러리를 사용 가능. 적절하게 섞어쓸 수 있음
SQL을 직접 실행할 수도 있지만, 간으하면 ORM tkdyd
- 직접 SQL문자열을 조합하지 말고, 인자로 처리 → SQL Injection 방지
- SQL Injection이란 악의적인 사용자가 특정 SQL 쿼리 문을 전송하여 서버 DB를 공격하는 해킹 기법
Django Model
데이터베이스 테이블과 파이썬 클래스를 1:1로 매핑
모델 클래스명은 단수형으로 지정 ex: Posts (x), Post (O)
- 클래스이기에 필히 첫 글자가 대문자인 PascalCase 네이밍
매핑되는 모델 클래스는 DB 테이블 필드내역이 일치해야 함
모델을 만들기 전에 서비스에 맞게 데이터베이스 설계가 필수
- 즉 관계형 데이터베이스 학습도 필요 (DB의 영역은 또 다름 )
앱 폴더에 있는 models.py 파일에 아래처럼 작성하게 됨
모델 활용 순서
- 장고 모델을 만들고, 데이터 베이스 형상 관리
- 모델 클래스 작성
- 모델 클래스로부터 마이그레이션 파일 생성 → makemigrations 명령
- 마이그레이션 파일을 데이터베이스에 적용 → migrate 명령
- 모델 활용
- 기존 외부 DB를 현재 데이터베이스로 가져와서 형상 관리
- 데이터베이스로부터 모델 클래스 소스 생성 → Inspectdb 명령
- 모델 활용
모델명과 DB 테이블명
DB 테이블명: 디폴트 “앱이름_모델명”
ex.
blog앱
- Post 모델: blog_post
- Comment 모델: blog_comment
shot 앱
- Item 모델: shot_item
- review 모델: shop_review
적용순서
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;
Author And Source
이 문제에 관하여(Django 모델 (ORM)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@a87380/Django-모델-ORM저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)