파이썬, Python/[Web] 웹개발 - 장고, Django

[Django, 웹개발] Django에서 MySQL 연동 완벽공략

밤바라 2020. 2. 19. 15:41

전제조건 : mysqlclient 설치(공략법은 아래 참고)

2020/02/15 - [파이썬, Python] - [Django, 웹개발] pip install mysqlclient 오류


Django에서 MySQL로 연동/연결하는 방법

1. Setting.py 에서 Database 입력

- "Ctrl + F" 로 "DATABASES" 검색 후 아래와 같이 복사/붙여넣기

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test_db',
        'USER': 'root',
        'PASSWORD' : '0000',
        'HOST' : 'localhost',
        'PORT' : '3306',
        'OPTIONS': {
            'init_command': 'SET sql_mode="STRICT_TRANS_TABLES"'}
}}

 

 

2. models.py 에서 데이터베이스를 연결

 - 아래와 같이 모델을 짜놓을 경우, Post class 내에 'author', 'title', 'text' ,'created_date', 'published_date' 

    등의 내용으로 db에 등록됨

from django.db import models.    

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

 

3. 'CMD' 창에서 'python manage.py makemigrations' 으로 모델의 변경사항을 저장

 - django에서 알 수 있도록 하는 과정

 

4. 'CMD' 창에서 'python manage.py migrate' 명령어를 쳐서 자동으로 database 내 schema를 관리해줌

 

Tip. 만약 'python manage.py runserver' 를 수행했을경우 특별한 이슈 없이 서버가 돌아감에도 불구하고

웹페이지에 데이터베이스에 저장한 내용들이 나오지 않을 경우

 1) admin으로 들어가서 게시물을 신규로 만들어본다.

 2) 데이터베이스에 들어가서 내가 만든 게시물이 저장이 되어 있는지 확인한다

   > 저장되어 있다면, 데이터베이스 Read/Write에는 전혀 이상이 없음

 3) 그렇다면 불러오는 조건에 문제가 있을 수 있음. 이를 확인하기 위해 python shell을 실행시켜 순차적으로 확인

python manage.py shell

   3-1) 처음으로 db에 저장되어있는 사항이 불러와지는지 다시확인

Post.objects.all()

  3-2) 정상적으로 불러와 진다면, 내가 views.py 에서 작성한 코드를 긁어서 넣어본다.

posts = Post.objects.filter(published_date__lte = timezone.now()).order_by('published_date')

  * 우선 위 내용을 설명하자면, 

   models.py에서 Post라는 class를 정의해서 데이터베이스에 접근하고자 했음.

   Post의 objects 들을 불러오는데, filter를 걸어서 불러올 예정

   filter는 published_date 를 기준으로 현재 시간보다 같거나 작을경우. 순서는 발행된 순서대로

   ** __lte 의 의미는 less than equal 이며 같거나 작은 값을 의미함. 

   *** order_by 에서 역순으로 하고싶을 경우 앞에 마이너스(-)를 붙이면 된다.  'published_date' > '-published_date' 

 

 3-3) 여기서 나의 경우 Query Set이 비어있었다. 살펴보니 published_date 값이 null 로 제외되어 있었음.

 3-4) 문제가 나왔으니 해결책도 자연스럽게 나온다. published_date 대신 created_date로 변경했음.

728x90
반응형