본문 바로가기

[Python] django 모델을 이용한 데이터베이스 처리

액트 2022. 8. 29.
반응형

장고는 모델(Model)을 활용하여 데이터베이스를 처리합니다.

sqlite 데이터베이스는 장고의 기본 데이터베이스입니다. 

보통은 데이터베이스에 SQL 쿼리문을 이용하여 데이터를 조회하고 저장하고 삭제하는 행위들을 하지만

장고의 모델(Model)을 사용하면 SQL 쿼리 문의 도움 없이 데이터를 쉽게 처리할 수 있습니다.

mysite\config\settings.py 파일에 보면 데이터베이스와 관련된 정보가 다음과 같이 정의되어 있습니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

데이터베이스 엔진은 django.db.backends.sqlite3로 정의되어 있고 

데이터베이스 파일은 BASE_DIR 디렉터리 밑에 db.sqlite3  파일에 저장한다고 정의되어 있습니다.

 

모델 작성하기

http://localhost:8000/pybo 페이지는 게시판 기능을 하는 페이지로 만들 예정입니다. 

즉 요청과 응답을 할 수 있는 게시판 페이지 입니다.

장고에서 요청과 응답을 할 수 있으려면 데이터 모델이 있어야 합니다.

요청과 응답에 대한 속성을 models.py 파일에 정의해 봅시다.

mysite\pybo\models.py 파일을 다음과 같이 수정해 봅시다.

Qeustion, Answer 의 대소문자를 구별해 주어야 합니다.

from django.db import models


class Question(models.Model):
    subject = models.CharField(max_length=200)		#요청 제목
    content = models.TextField()			#요청 내용
    create_date = models.DateTimeField()		#요청 일자


class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)		#어떤 요청인지
    content = models.TextField()						#응답 내용
    create_date = models.DateTimeField()					#응답 일시

 

테이블 생성하기

이제 작성한 모델을 이용하여 테이블을 생성해 봅시다. 

테이블을 생성하기 위해서 pybo 앱을 config\setting.py 파일의 INSTALLED_APPS 항목에 추가해야 합니다.

INSTALLED_APPS = [
    'pybo.apps.PyboConfig',		# <<< 추가
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

INSTALLED_APPS에 추가한 pybo.apps.PyboCofnig 클래스는 pybo/apps.py 파일에 있는 클래스입니다.

이 apps.py 파일은 pybo 앱 생성 시 자동으로 생성되는 파일입니다.

 

위와 같이 INSTALLED_APPS 항목에 추가한 후 테이블 생성을 위해 migrate 명령어를 수행하면 됩니다.

CMD(명령 프롬프트) 창에서 다음과 같이 명령어를 차례대로 작성하십시오.

(myvenv) c:\projects\mysite>python manage.py migrate
(myvenv) c:\projects\mysite>python manage.py makemigrations

makemigrations 명령은 모델을 생성하거나 모델에 변화가 있을 경우에 실행해야 하는 명령어입니다.

명령어가 정상적으로 잘 실행되었다면 pybo\migrations\0001_initial.py라는 파일이 자동으로 생성됩니다.

sqlmigrate

makemigrations 명령어로 데이터베이스 작업 파일을 생성하고 migrate 명령을 실행하기 전에 실제 어떤 쿼리문이 실행되는지 sqlmigrate 명령으로 확인해 볼 수 있습니다.

(myvenv) c:\projects\mysite>python manage.py sqlmigrate pybo 0001

sqlmigrate 명령어는 쿼리 조회 명령어입니다.

 

migrate

이제 migrate 명령어를 수행하여 실제 테이블을 생성해 봅시다.

(myvenv) c:\projects\mysite>python manage.py migrate

정상적으로 생성되었다면 "DB Browser for SQLite"를 이용하여 확인해 봅시다.

해당 프로그램은 https://sqlitebrowser.org/dl/ 에서 다운로드하여 설치할 수 있습니다.

 

Downloads - DB Browser for SQLite

(Please consider sponsoring us on Patreon 😄) Windows Our latest release (3.12.2) for Windows: Windows PortableApp Note - If for any reason the standard Windows release does not work (e.g. gives an error), try a nightly build (below). Nightly builds ofte

sqlitebrowser.org

위 사이트에 접속하여 "DB Browser for SQLite - Standard installer for 64-bit Windows" 를 클릭하여 다운로드 후 설치합니다.

설치는 특별한거 없이 지속해서 Next 를 클릭해주면 됩니다.

설치 완료 후 "DB Browser (SQLite)" 프로그램을 실행합니다.

[데이터베이스 열기 -> C:\projects\mysite\db.sqlite3 파일 선택]을 하면 다음처럼 생성된 테이블들을 볼 수 있습니다.

반응형

 

장고 모델 사용하기

장고 모델 사용을 장고 셸을 이용하여 익혀봅시다.

장고 셸을 다음과 같이 CMD(명령 프롬프트)에서 실행해 봅시다.

(myvenv) c:\projects\mysite>python manage.py shell

 

Question 생성

Question 과 Answer 모델은 장고 셸에서 다음처럼 import 하여 사용할 수 있습니다.

>>> from pybo.models import Question, Answer

먼저 Question 모델을 이용하여 질문 데이터를 만들어 봅시다.

우선 Question 클래스의 속성은 Subject(제목), content(내용), create_date(요청일자) 로 구성되어 있습니다.

>>> from django.utils import timezone
>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=timezone.now())
>>> q.save()

from django.utils import timezone 구문은 timezone.now() 함수를 사용하기 위한 구문입니다.

데이터가 1건이 생성되면 다음처럼 id 값이 생성됩니다.

id는 모델 데이터의 유일한 값이므로 프라이머리 키라고도 합니다. 이 id 값은 데이터를 생성할 때마다 1씩 증가합니다.

2번째 질문 데이터를 만들어봅시다.

>>> q = Question(subject='장고 모델 질문입니다.', content='id는 자동으로 생성되나요?', create_date=timezone.now())
>>> q.save()
>>> q.id
2

 

Ouestion 조회

저장한 Question 모델의 데이터는 Question.objects 를 통해서 조회할 수 있습니다.

>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>]>

Question.objects.all() 은 모든 Question 데이터를 조회하는 함수입니다.  

결과값의 (1)과 (2)는 id 값입니다.

Question 모델에 __str__ 메서드를 추가하면 id 값 대신 제목을 표시할 수 있습니다.

mysite\pybo\models.py 파일을 수정합니다.

question 함수 구문에 아래 문구를 추가합니다.

    def __str__(self):
        return self.subject
# Create your models here.
from django.db import models


class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()
    
    def __str__(self):				<< 추가
    	return self.subject

models.py 파일을 저장하고 장고 셸을 재시작해줍니다.

셸 종료는 Ctrl+Z 또는 Quit() 입력하시면 됩니다.

셸을 다시 실행하시고 나서 다시 모델의 question, answer 를 import 한 후에 실행해 주셔야 합니다.

id 값 대신에 제목이 표시되는 것을 확인하실 수 있습니다.

모델의 메서드가 추가될 경우네는 makemigration 와 migrate를 수행할 필요가 없습니다. 

makemigration과 migrate 명령이 필요한 경우는 모델의 속성이 변경되었을 때 뿐입니다.

 

Question 수정

제목을 수정해 봅시다. 먼저 다음과 같이 id가 2인 데이터를 조회합니다.

>>> q = Question.objects.get(id=2)
>>> q
<question: 장고 모델 질문입니다.>

수정은 다음과 같습니다.

>>> q.subject = 'Django Model Question'
>>>

다음 저장 후 확인합니다.

>>> q.save()
>>> q
<question: Django Model question>

 

Question 삭제

이번에는 id 값이 1인 question 데이터를 삭제해 봅시다.

>>> q = Question.objects.get(id=1)
>>> q.delete()
(1, {'pybo.question': 1})

delete()를 수행하면 해당 데이터가 삭제됩니다. 삭제될 때는 위와 같이 추가 정보가 리턴됩니다.

 

Answer 작성

답변 데이터를 생성해 봅시다.

>>> q = Question.objects.get(id=2)
>>> q
<question: Django Model question>
>>> from django.utils import timezone
>>> a = Answer(question=q, content='네 자동으로 생성됩니다.', create_date=timezone.now())
>>> a.save()

답변 데이터를 만들기 위해서 질문이 필요하므로 id가 2인 질문을 먼저 조회한 후 Answer의 question 속성에 q를 대입해 주었습니다.

 

Answer 조회

답변을 조회하는 방법은 질문과 마찬가지로 answer의 id값을 사용하면 됩니다.

>>> a = Answer.objects.get(id=1)
>>> a
<Answer: Answer object (1)>

answer객체인 a를 사용하면 답변에 연결된 질문도 조회할 수 있습니다.

>>> a.question
<Question: Django Model Question>

 

 

점프 투 장고 책을 보면서 공부한 내용을 기록하였습니다. 보다 정확하고 자세한 내용은 책을 참고해 주시기 바랍니다.

반응형

댓글