Study/django

DB를 먼저 설계하고 django와 연동하기 (3) - inspectdb로 생성된 models.py로 migrations 후 비교

bluebamus 2023. 12. 8.

github 저장소 : https://github.com/bluebamus/synchronization-test-between-django-and-db

 

1. DB를 먼저 설계하고 django와 연동하기 (1) - 작업 정의

2. DB를 먼저 설계하고 django와 연동하기 (2) - migration 후 db 추가 설계 그리고 inspectdb

3. DB를 먼저 설계하고 django와 연동하기 (3) - inspectdb로 생성된 models.py로 migrations 후 비교

4. DB를 먼저 설계하고 django와 연동하기 (4) - fake를 사용해 migrate 후 models.py 수정 반영하기

5. DB를 먼저 설계하고 django와 연동하기 (5) - view table 테스트

6. DB를 먼저 설계하고 django와 연동하기 (6) - 함수와 lock 사용하기

 

 1. clean test

   - clean test를 위해 모든 코드를 새로운 프로젝트로 옮긴다.

   - inspectdb로 생성한 code를 sync app을 만들어 복사한다.

      - index와 default를 모두 정의했다.

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone


# Create your models here.
class Items(models.Model):
    item_name = models.CharField(max_length=20)
    item_group = models.CharField(max_length=10)
    item_number = models.IntegerField()
    default_order_stock = models.IntegerField(default=30)
    created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True)

    class Meta:
        managed = True
        db_table = "items"
        unique_together = (("item_name", "item_number"),)
        indexes = [
            models.Index(fields=["item_group"], name="items_group_idx"),
        ]


class Stock(models.Model):
    item = models.ForeignKey(Items, models.DO_NOTHING)
    item_stock = models.IntegerField(default=0)
    discontinued = models.BooleanField(default=False)
    discontinued_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        managed = True
        db_table = "stock"


class StockOrder(models.Model):
    item = models.ForeignKey(Items, models.DO_NOTHING)
    admin = models.ForeignKey(User, models.DO_NOTHING)
    order_quantity = models.IntegerField()
    ordered_at = models.DateTimeField(blank=True, null=True, auto_now_add=True)
    estimated_arrival_time = models.DateTimeField(blank=True, null=True)

    class Meta:
        managed = True
        db_table = "stock_order"


class UserOrder(models.Model):
    order_quantity = models.IntegerField()
    order_number = models.BigIntegerField()
    item = models.ForeignKey(Items, models.DO_NOTHING)
    user = models.ForeignKey(User, models.DO_NOTHING)
    created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True)

    class Meta:
        managed = True
        db_table = "user_order"

 

   - 테스트를 위해 sync_temp라는 스키마를 만들고 동기화 한다.

 

 2. 새로 생성된 table 확인

   - default로 정의된 파라미터 값들은 default에 정의되지 않는 것을 확인할 수 있다.

      - 필드의 default는 코드에서 관리되지 table에서 관리되지 않는다.

   - 중요한 차이점으로 id의 생성을 말할 수 있다. 

      - django에서는 int8 데이터 타입의 indentity 속성에 'By Default'가 정의되어 순차 증가된다.

      - postgresql에서 지원하는 serial4 데이터 타입으로 필드를 생성하면 자동으로 default 속성에 자동 증가를 위한 "nextval('sync_test.items_id_seq'::regclass)" 가 정의된다.

      - 이러한 비교를 통해 default 속성은 database에서 직접 sql query로 동작을 수행했을 경우 생성되는 것이고, django에서는 별도로 정의하는 항목 없이 자동생성되는 id에 대해서 identity 속성으로 자동 증가를 수행한다.

   - items

      - index는 meta에서 정의한 이름으로 생성 된 것을 확인할 수 있다.

   - user_order

   - stock

   - stock_order

 

 3. 다음 작업

   - 기존 db에 index와 default가 정의된 models.py를 --fake를 이용해 migrate하여 동기화

   - django에서 db 구조 변경 후 migrate를 이용한 동기화

댓글