본문 바로가기

문돌이 존버/Django 스터디

Mac 버전 장고 데이터베이스 관리 1탄

반응형

지난 번 기초적인 장고 웹서버 세팅을 살펴봤습니다. 이번에는 본격적으로 데이터베이스 관리를 위한 설정을 진행하려고 합니다.

<출처: TECH Talk>

first 폴더 안에 있는 settings.py를 클릭하고 다음과 같이 INSTALLED_APPS에 myapp.apps.MyappConfig를 추가해줍니다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'myapp.apps.MyappConfig' 
]

데이터베이스를 관리할 때 기본적으로 SQL을 사용하기도 하지만 장고는 ORM(Object-Relational Mapping)을 지원합니다. 저는 SQL을 제대로 배워본 적이 없어 장고가 지원하는 ORM을 통해 DB 관리를 진행하도록 하겠습니다. 아래와 같이 myapp 폴더 안에 있는 models.py에서 class Post를 선언해주고 그 안에 각 항목에 맞게 models의 모듈 Field를 불러옵니다.(필요한 필드는 장고 documentation에서 참고)

from django.db import models

# Create your models here.

class Post(models.Model):
    title = models.CharField(max_length=50) # CharField의 경우, 적절한 길이의 스트링에 적합
    content = models.TextField()
    create_date = models.DateTimeField(auto_now_add=True)
    modify_date = models.DateTimeField(auto_now=True) 
    # auto_now_add=True: 처음에 add될 때, 자동으로 날짜 필드를 채워주기
    # auto_now=True: 처음 추가될 때뿐만 아니라, 값이 변경될 때 자동으로 맞춰 저장해주기

migrations는 데이터베이스 상태를 기록하는 공간, 즉 히스토리를 확인할 수 있어 매우 유용합니다. python manage.py makemigrations 명령어를 통해 migration 파일을 생성할 수 있습니다. 이후에는 python manage.py migration 을 통해 실제 데이터베이스에 적용해줍니다. 

python manage.py shell 을 입력하면 장고를 테스트할 수 있는 파이썬 환경이 시작됩니다. 

>>> from myapp.models import Post
>>> Post.objects.create(title='제목을 입력해주세요', content='내용을 입력해주세요')

quit()를 통해 파이썬 환경에서 빠져나온 뒤 models.py를 클릭하여 class Post 안에 아래와 같이 __str__ 스페셜 메서드를 입력해줍니다. 이는 쉽게 말해 각 데이터를 구분해주는 역할을 합니다. 아래에선 데이터의 title과 create_date 라는 변수가 출력되어 데이터 간 identify 해주는 것이죠. 

def __str__(self):
        return self.title + str(self.create_date)

다시 파이썬 환경에 진입한 뒤 아래의 명령어를 단계별로 입력해보면서 출력값을 살펴보시기 바랍니다. 

>>> from myapp.models import Post
>>> Post.objects.all()
>>> a = Post.objects.first()
>>> a
>>> a.title
>>> a.content
>>> a.create_date
>>> p.content = '내용 수정 테스트'
>>> p.save() # 내용 수정한 후 save를 해야 반영됩니다. 
>>> p.content

>>> post = {'title': '다음 제목을 입력해주세요', 'content': '내일은 elasticsearch를 해결했으면 좋겠습니다'}
>>> post
>>> Post.objects.create(**post) # unpacking 이용해서 전에 선언한 post 가리킴
>>> Post.objects.all()

맨 마지막 줄 Post.objects.all()을 입력하면 이전에 생성했던 Post 객체까지 나올 것입니다. 쉽게 설명하면 현재 우리가 구축하고 있는 DB 형태는 다음과 같은 테이블 형식이며 우리는 row를 정해주고 있는 것이죠. 

객체 title content create_date modify_date
1 제목을 입력해주세요 내용을 입력해주세요 ... ...
2 다음 제목을 입력해주세요 내일은 elasticsearch를 해결했으면 좋겠습니다 ... ...
3 ... ... ... ...

Post.objects.all() 출력 형태는 QuerySet인데요, 리스트나 딕셔너리처럼 for 문을 돌릴 수 있습니다. 참고로 Post.objects.filter() 역시 출력 형태가 QuerySet이며 여러 개의 객체를 출력할 수 있습니다. 반면에, Post.objects.get()의 경우는 1개의 객체 출력만 가능합니다. 

>>> for post in Post.objects.all():
	print(post)
    
>>> a1 = Post.objects.first()#첫 번째 객체
>>> a2 = Post.objects.last() #두 번째 객체
>>> Post.objects.get(id=1) == a1
>>> Post.objects.get(id=2) == a2

>>> Post.objects.filter(id=1)
>>> Post.objects.filter() # 조건이 없다면 모든 데이터 출력

>>> Post.objects.filter(create_date__year=2020)
>>> Post.objects.filter(title__startswith='제목')
728x90
반응형