[django] 모델 만드는 법
애플리케이션의 다양한 데이터 저장방법
- 데이터 베이스 : RDBMS, NoSQL 등
- 파일 : 로컬, 외부 정적 스토리지
- 캐시서버 : memcached, redis 등
데이터베이스와 SQL
데이터베이스의 종류
- RDBMS (관계형 데이터베이스 관리 시스템)
- PostgresSQL, MySQL, SQLite, MS-SQL, Oracle 등
- NoSQL : MongoDB, Cassandra, CouchDB, Google BigTable 등
데이터베이스에 쿼리하기 위한 언어 -> SQL
- 같은 작업을 하더라도, 보다 적은 수의 SQL, 보다 높은 성능의 SQL
- 직접 SQL을 만들어내기도 하지만, ORM(Object-relational mapping)을 통해 SQL을 생성/실행하기도 한다.
- Not Magic
- 중요) ORM을 쓰더라도, 내가 작정된 ORM코드를 통해 어떤 SQL이 실행되고 있는 지, 파악을 하고 이를 최적화할 수 있어야한다.
- django-debug-toolbar 적극 활용
장고 ORM인 모델은 RDB만을 지원
- Microsoft SQL Server는 django-pyodbc-azure 라이브러리가 필요
다양한 파이썬 ORM(awesome-python#orm)
- Relational Databases
- Django Models, SQLAlchemy, Orator, Peewee, PonyORM 등
- NoSQL Databases
- django-mongodb-engine, hot-redis, MongoEngine, PynamoDB 등
장고의 강점은 Model과 Form
물론, 장고에서도 다양한 ORM, 라이브러리 사용 가능.
강력한 Model/Form
물론, 적절하게 섞어쓸 수도 있다.
SQL을 직접 실행할 수도 있지만, 가능하면 ORM을 쓰자
- 직접 SQL문자열을 조합하지 말고, 인자로 처리 -> SQL Injection 방지
from django.db import connection, connections
with connection.cursor() as cursor:
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
print(row)
장고 shell 실행 방법
- python manage.py shell
- from django.db import connection, connections
- cursor = connection.cursor()
- cursor.close()
- exit()
Django Model
장고 내장 ORM
**<데이터베이스 테이블="">과 <파이썬 클래스="">를 1:1로 매핑**파이썬>데이터베이스>
- 모델 클래스명은 단수형으로 지정 - 예 : Posts (X), Post(O)
- 클래스이기에 필히 “첫 글자가 대문자인 PascalCase 네이밍”
- 매핑되는 모델 클래스는 DB 테이블 필드 내역이 일치해야함
- 모델을 만들기 전에, 서비스에 맞게 데이터베이스 설계가 필수
- 이는 데이터베이스의 영역 -> 관계형 데이터베이스 학습도 필요
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
create_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
모델 활용 순서
- 장고 모델을 통해, 데이터베이스 형상을 관리할 경우
- 모델 클래스 작성
- 모델 클래스로부터 마이그레이션 파일 생성 -> makemigrations 명령
- 마이그레이션 파일을 데이터베이스에 적용 -> migrate 명령
- 모델 활용
- 장고 외부에서, 데이터베이스 형상을 관리할 경우
- 데이터베이스로부터 모델 클래스 소스 생성 è inspectdb 명령
- 모델 활용
모델명과 DB 테이블명
DB 테이블명 : 디폴트 “앱이름_모델명”
예
- blog앱
- Post 모델 -> “blog_post”
- Comment 모델 -> “blog_comment”
- shop 앱
- Item 모델 à “shop_item”
- Review 모델 à “shop_review”
커스텀 지정
모델 Meta 클래스의 db_table 속성
모델 만드는 법
새로운 앱이 없다면?
- python manage.py startapp 앱이름
- settings.py에 들어가 INSTALLED_APPS에 앱이름 추가
- urls.py 파일 만들기
- urls 파일에 urlpatterns = [] 써놓기
- 전체 패키지앱의 urls.py에 가서 path(‘앱이름/’, include(‘앱이름.urls’)), 추가
-
shop/models.py
from django.db import models class Item(models.Model): name = models.CharField(max_length=100) desc = models.TextField(blank=True) price = models.PositiveIntegerField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True)
- python manage.py makemigrations 앱이름
- python manage.py migrate 앱이름
- python manage.py sqlmigrate 앱이름 0001_initial 을 하게 되면 실제 데이터베이스에 들어가는 쿼리를 볼 수 있다.
- python manage.py dbshell 을 치고 들어가면 sqlite 쉘로 들어가게 됨
- .tables 를 하면 테이블 목록이 나옴
- .schema 앱이름_모델명 을 치면 스키마도 볼 수 있다.
- .quit으로 스키마를 나가게됨.
댓글남기기