DB를 먼저 설계하고 django와 연동하기 (5) - view table 테스트
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 사용하기
- 이번 과정에서는 2개의 방법으로 view 테스트를 진행하고 프로시저를 이용한 CURD와 lock에 대한 테스트를 수행한다.
1. django commands로 더미 데이터 생성하기
- commands의 생성 방법은 생략한다 github 프로젝트 코드를 확인하면 된다.
- user (사용자) 30개 생성
python manage.py seed_users --users 30
- user_order (사용자 구매 이력) 30개 생성
python manage.py seed_users --userorder 30
- item (상품) 30개 생성
python manage.py seed_users --items 30
- stock (재고) 30개 생성
python manage.py seed_users --stock 30
- stock_order (재고 주문) 30개 생성
python manage.py seed_users --stockorder 30
2. postgresql에서 생성한 view table과 동기화 하기
1) inpectdb로 코드 생성
- item의 제품 상용 코드는 그룹 코드와 아이템 넘버를 '-' 구분자를 사용해 결합하여 사용한다고 가정한다
- 예) xxxxxx-xxxx
- postgresql에 주문된 제품에 대해 full code를 view 테이블로 만들어 제공하고자 한다.
- view 테이블을 생성하기 위한 sql 코드는 다음과 같다.
CREATE VIEW item_code_in_order as
select uo.id,i.item_name, i.item_group || '-' || i.item_number as item_full_code
from user_order uo
join items i on i.id = uo.item_id;
- inspectdb를 실행한다.
python manage.py inspectdb item_code_in_order > models.py
- 생성된 코드는 다음과 같다.
- sync app의 models.py에 붙여 넣기를 하자.
- makemigrations & migrate를 할 필요가 없다.
class ItemCodeInOrder(models.Model):
item_name = models.CharField(max_length=20, blank=True, null=True)
item_full_code = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'item_code_in_order'
- jupyter notebook으로 테스트를 수행한다.
- 현재 shell_plus --notebook에 문제가 있는 것으로 확인되었다. --lab 옵션을 사용하면 된다
- 해당 코드는 github 프로젝트에 업로드 해 놓았다.
- 10개의 결과값을 가져와 본다.
2) models.py에서 managed = False로 migrate 하기
- stock order 주문에 대해 추가 item 정보와 사용자 정보를 추가해 view 테이블로 만들고자 한다.
- view 테이블을 생성하기 위한 sql 코드는 다음과 같다.
CREATE VIEW full_info_for_stock_order AS
SELECT i.id, i.item_name, i.item_full_code, u.username, u.last_name, u.first_name, u.email
FROM (
SELECT so.id, i.item_name, i.item_group || '-' || i.item_number as item_full_code
FROM stock_order so
JOIN items i ON so.item_id = i.id
) i
JOIN (
SELECT so.id, au.username, au.last_name, au.first_name, au.email
FROM stock_order so
JOIN auth_user au ON so.admin_id = au.id
) u ON i.id = u.id;
- sync app의 models.py에 코드를 생성한다.
class FullInfoForStockOrder(models.Model):
item_name = models.CharField(max_length=20, blank=True, null=True)
item_full_code = models.TextField(blank=True, null=True)
username = models.CharField(max_length=150, blank=True, null=True)
last_name = models.CharField(max_length=150, blank=True, null=True)
first_name = models.CharField(max_length=150, blank=True, null=True)
email = models.CharField(max_length=254, blank=True, null=True)
class Meta:
managed = False
db_table = "full_info_for_stock_order"
- jupyter notebook으로 테스트를 수행한다.
- 10개의 결과값을 가져와 본다.
3. django-db-views 라이브러리 사용
- 참고 : https://velog.io/@_gyullbb/Django-o1k5ozu0r3
- 참고 : https://pypi.org/project/django-db-views/
- 사용 예시를 찾아보고 학습을 할 필요가 없다 판단했다. 하지만 참고한 포스팅의 기록을 남긴다.
- 사용 방법이 복잡하고, 아무래도 sql query로 만드는 것과 비교하여 과정에 대해 직관적이지 않고 신뢰성 보장 문제도 있기에 앞으로 사용할 일이 없을것 같다.
- reference :
https://medium.com/@ulr0xb/django-view-table-749a258167ec
https://velog.io/@_gyullbb/Django-o1k5ozu0r3
https://books.agiliq.com/projects/django-orm-cookbook/en/latest/database_view.html