ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django, 웹개발] Django에서 MySQL 연동 완벽공략
    파이썬, Python/[Web] 웹개발 - 장고, Django 2020. 2. 19. 15:41
    728x90

    전제조건 : 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로 변경했음.

    반응형
Designed by Tistory.