PBL : DB Table 마이그레이션

송민준·2023년 7월 13일

PBL 교육

목록 보기
7/11

들어가기 전

  • middleware의 필요성. : 광고가 나오는지 계속 체크해주는 미들웨어가 필요하다.

  • varnish: 텍스트 캐싱. 요즘은 미디어도 캐싱한다. 원래 63대 서버를 사용했다면 30대를 써도 된다.

  • 서버 1대 세팅을 할 때 드는 시간이 3시간이라면 100대를 세팅하려면 300시간이 필요하다. → 셰프라는 툴은 코드 기반으로 자동으로 세팅을 한다. 실제로 셰프를 사용하게 되면 몇시간만에 3~400대 세팅이 가능하다. 생각보다 현업에서는 이런걸 많이 쓴다.

    • vanish, 셰프를 이야기한 이유는 대형사들에서는 어마어마한 서비스를 관리해야한다. 물리적인 사람 힘으로 하려면 힘들다. 그렇기 때문에 자동화가 필요하다. 큰 회사는 코드가 코드를 개발하는 식으로 개발한다. (?) 그걸 개발하는 개발자를 원한다.

Task

DB Table Create

  • Create DB

    • models.py 작성

      • MediaTypeInfo
        • In crud/models.py
          from django.db import models
          
          # Create your models here.
          class MediaTypeInfo(models.Model):
              id = models.AutoField(primary_key=True)
              width = models.IntegerField()
              height = models.IntegerField()
              type = models.CharField(max_length=10)
          
          • 이 테이블은 광고 슬롯을 정의한다.
      • ADInfo
        • In crud/models.py
          class ADInfo(models.Model):
              id = models.AutoField(primary_key=True)
              media_type_id = models.ForeignKey("crud.MediaTypeInfo", on_delete=models.CASCADE)
              name = models.CharField(max_length=30)
              definition = models.CharField(max_length=60, null=True, blank=True)
              start_date = models.DateTimeField(null=True, blank=True)
              end_date = models.DateTimeField(null=True, blank=True)
              mod_date = models.DateTimeField(null=True, blank=True)
              advertiser = models.CharField(max_length=10)
              cost = models.IntegerField()
              click_cnt = models.IntegerField(null=True, blank=True)
              url = models.CharField(max_length=150)
              content_path = models.CharField(max_length=150)
          • 아무것도 안넣었을 때 null로 저장되도록 null=True, blank=True 을 추가했다.
    • 마이그레이션

      • python [manage.py](http://manage.py) makemigrations : git 처럼 데이터베이스도 버전관리를 하기 위해 migration 파일을 만든다.
      • python [manage.py](http://manage.py) migrate : 데이터베이스에 그 변경사항을 적용시킨다.
    • 테스트

      • 테스트를 위해 crud/test.py에 추가했다.

        from django.contrib import admin
        from crud.models import *
        
        # Register your models here.
        admin.site.register(MediaTypeInfo)
        admin.site.register(ADInfo)
      • python [manage.py](http://manage.py) runserver

      • http://localhost/admin

        • MediaTypeInfo

        • ADInfo

          • MediaTypeID가 FK 속성이기 때문에 방금 만든 MediaTypeInfo 튜플을 참조했다.
        • 완료

  • 고민한점

    • 하나의 DB 안 테이블을 두개의 서버가 사용하려고 한다.

      • 어떤 서버 한개가 마이그래이션을 통해 테이블을 생성한다.

      • 그러면 다른 서버는 어떻게 테이블을 ORM을 통해 조작할 수 있을까

        python [manage.py](http://manage.py) inspectdb 사용!

      • inspectdb 명령은 장고 세팅 파일에 정의된 데이터베이스에서 모든 테이블의 스키마를 가져온다.

      • 해결 방법

        • python [manage.py](http://manage.py) inspectdb [models.py](http://models.py)
        • 이를 app 단의 models.py에 옮긴다. (나의 경우에는 projectFile/AD/models.py)
        • python [manage.py](http://manage.py) makemigrations
        • python manage.py migrate
      • 결과

        • 이미 생성했던 MediaTypeInfo Object(3)가 나온다.
profile
개발자

0개의 댓글