전 편(1. 게시판 만들기 - Django 3.x 설치 및 핵심개념 파악) 에서 Django 설치와 index페이지를 구성해보았다. 전 편에 이어서 데이터베이스 mariaDB를 Django와 연동하고 마이그레이션 기능을 사용해서 모델을 배포(테이블 생성)한다.
mariaDB
MariaDB는 open-source RDBMS이다. MySQL과 동일한 엔진으로 구성되어 있어 사용에 있어 대부분의 기능이 동일하다. MariaDB는 성능면에서 전신인 MySQL에 비해 최고 70% 향상 되었다고 설명한다. HeidisSQL 윈도우용 DB관리 툴을 기본적으로 제공한다.
Install
MariaDB는 공식사이트에 접속하여 윈도우 64비트 버전을 Download, 설치한다. ( 설치시 root 사용자 비번 기억할 것 ! )
설치 후 HeidisSQL을 실행한다.
셰션이름은 원하는 이름으로 등록해도 무방하다. 암호를 넣고 "열기"버튼을 눌러 프로젝트에서 사용할 데이터베이스를 신규로 등록한다.
myboard라는 이름으로 등록하였다. 해당 이름은 Django setting파일에 접속정보로 사용하므로 기억하자.
Django와 mariaDB연동을 위해 mysqlclient 라이브러리를 설치한다.
pip install mysqlclient
데이터베이스 접속 정보 설정
mariaDB가 정상적으로 설치 되었다면 settings파일에 DATABASES 변수를 다음과 같이 변경한다.
mysite/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # mysqlclient librarly 설치
'NAME': 'myboard',
'USER': 'root',
'PASSWORD': '****', # mariaDB 설치 시 입력한 root 비밀번호 입력
'HOST': 'localhost',
'PORT': ''
}
}
수정 후 server 실행 시 올바른 접속이 이루어진 경우 오류메시지 없이 기동된다.
python manage.py runserver
App 설정 및 TIME_ZONE 추가
mysite/settings.py
INSTALLED_APPS = [
'board.apps.BoardConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
TIME_ZONE = 'Asia/Seoul'
USE_TZ = True
django.utils의 timezone 사용시 Seoul( UTC + 9 )시간을 얻기 위해 TIME_ZONE을 셋트한다.
모델 생성
게시판은 글쓰기를 관리하는 board와 해당 글의 댓글을 관리하는 reply로 이루어진다.
모든 Database table은 Django에서 모델(Model)로 관리할 수 있다.
board/models.py
from django.db import models
class Board(models.Model):
"""
title: 제목
content: 내용
author: 작성자
like_count: 좋아요 카운트
pub_date: 배포일
"""
title = models.CharField(max_length=100)
content = models.CharField(max_length=500)
author = models.CharField(max_length=100)
like_count = models.PositiveIntegerField(default=0) # 양수입력 필드
pub_date = models.DateTimeField()
def __str__(self):
return self.title
class Reply(models.Model):
"""
reply: Reply -> Board 연결관계
comment: 댓글내용
rep_date: 작성일
"""
reply = models.ForeignKey(Board, on_delete=models.CASCADE)
comment = models.CharField(max_length=200)
rep_date = models.DateTimeField()
def __str__(self):
return self.comment
Board는 Reply 모델에 대해 1:N 관계를 갖는다. Reply는 Board에 자식모델(테이블)로class ForeignKey(to, on_delete, **options) 로 관계를 맺는다. on_delete=models.CASCADE 옵션은 foreignKey가 삭제되는 경우 참조되는 해당 자식데이터를 지운다.
PrimaryKey는 별도로 지정하지 않으면 디폴트로 다음과 같은 코드가 각 모델에 수행된다.
id = models.AutoField(primary_key=True)
특정 필드에 PrimaryKey를 부여하는 경우 해당 필드에 primary_key=True 옵션을 넣어준다.
models.CharField는 문자열 필드, DateTimeField는 날짜를 의미한다.
모델의 필드 구성은 아래 레퍼런스 사이트를 참조한다.
docs.djangoproject.com/en/3.1/ref/models/fields/#field-types
Migrations 커맨드 실행
생성된 모델을 마이그레이션 객체로 변환하기 위해 다음 커맨드를 수행한다.
C:\myexam\mysite> python manage.py makemigrations
Migrations for 'board':
board\migrations\0001_initial.py
- Create model Board
- Create model Reply
수행결과에 보면 0001_initial.py가 생성된 것을 확인할 수 있다. 이제 migrate 명령으로 데이터베이스에 모델을 배포한다.
C:\myexam\mysite> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, board, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying board.0001_initial... OK
Applying sessions.0001_initial... OK
board 외에 admin, auth, session관련 모델도 배포가 된 것을 확인할 수 있는데 이는 settings.py에 App으로 등록되어 있기 때문이다.
DATABASE TABLE 생성 확인
HeidiSQL로 접속하여 테이블이 정상 배포 되었는지 확인한다.
Shell API로 모델 데이타 생성
C:\myexam\mysite>python manage.py shell
>>> from board.models import Board, Reply
>>> from django.utils import timezone
>>> b = Board(title="Hello world!", content="Hello nice to meet you", author="choi", pub_date=timezone.now())
>>> b2 = Board(title="How's weather there?", content="Hello nice to meet you", author="choi", pub_date=timezone.now(
))
>>> b.save() # Database 저장
>>> b2.save() # Database 저장
>>>
>>> Board.objects.all()
<QuerySet [<Board: Hello world!>, <Board: How's weather there?>]>
>>> b_1 = Board.objects.get(id=1)
>>> b_2 = Board.objects.get(id=2)
>>> b_1
<Board: Hello world!>
>>> b_2
<Board: How's weather there?>
>>> b_1.reply_set.create(comment="nice meet you too", rep_date=timezone.now())
<Reply: nice meet you too>
>>> b_1.reply_set.create(comment="nice meet you too2", rep_date=timezone.now())
<Reply: nice meet you too2>
>>> b_1.reply_set.create(comment="nice meet you too3", rep_date=timezone.now())
<Reply: nice meet you too3>
>>> b_2.reply_set.create(comment="Here is very nice", rep_date=timezone.now())
<Reply: Here is very nice>
>>> b_2.reply_set.create(comment="It's raining now", rep_date=timezone.now())
<Reply: It's raining now>
관계테이블 생성(create)시 save 할 필요 없이 바로 테이블에 생성된다. 모델이 foreignKey로 연결되어 있다면 연결된 모델을 _set 함수로 접근하며 Related objects 객체가 리턴된다.
여기까지 MariaDB 설치 부터 Model 생성, 배포까지 알아보았다. 기존 SQL에 익숙한 사람에겐 생소할 수 있으나 Model 개념에 조금만 익숙해지면 그만의 장점을 알게 될 것이다. Code레벨에서 쉽게 데이터베이스에 접근, 테이블을 관리 할 수 있으며 유닛테스트 시 테스트용 데이타를 케이스에 맞게 생성 할 수도 있다.
다음 편에선 게시판다운 화면을 구축하기 위해 html, css를 손보고 게시글 작성, 상세페이지 이동등의 기능을 구현해본다.
'python > Django' 카테고리의 다른 글
1. Django with bootstrap, 웹페이지 기본 프레임 및 메뉴 구성( top, left, main ) (3) | 2021.02.26 |
---|---|
4. 게시판 만들기 - Django 템플릿 & 페이징(Pagination) 처리( feat. GIF ) (0) | 2021.02.04 |
3. 게시판 만들기 - Django 게시판 목록, 읽기, 쓰기 페이지 구성 (0) | 2021.02.04 |
Django templates 날짜(datetime) 포맷 변경 및 UTC 설정 (0) | 2021.02.03 |
1. 게시판 만들기 - Django 3.x 설치 및 핵심개념 파악 (0) | 2021.02.01 |