DB를 먼저 설계하고 django와 연동하기 (3) - inspectdb로 생성된 models.py로 migrations 후 비교
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를 이용한 동기화
'Study > django' 카테고리의 다른 글
DB를 먼저 설계하고 django와 연동하기 (5) - view table 테스트 (1) | 2023.12.12 |
---|---|
DB를 먼저 설계하고 django와 연동하기 (4) - fake를 사용해 migrate 후 models.py 수정 반영하기 (0) | 2023.12.08 |
DB를 먼저 설계하고 django와 연동하기 (1) - 작업 정의 (0) | 2023.12.04 |
[udemy] - Build a Backend REST API with Python & Django - Beginner 학습 정리 (1) | 2023.10.20 |
[udemy] Build REST APIs with Django REST Framework and Python 학습 후기 (0) | 2023.10.13 |
댓글