[Django, 웹개발] Django에서 MySQL 연동 완벽공략
전제조건 : 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로 변경했음.