Study/django

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

bluebamus 2023. 12. 12.

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

 

Django View Table

View Table?

medium.com

https://velog.io/@_gyullbb/Django-o1k5ozu0r3

 

Django에서 View table 만들기 #1

1. Database View란? 우선 위키백과에 따르면 View는 "관계 데이터베이스의 데이터베이스 언어 SQL에서 하나 이상의 테이블 (또는 다른 View)에서 원하는 모든 데이터를 선택하여, 그들을 사용자 정의하

velog.io

https://books.agiliq.com/projects/django-orm-cookbook/en/latest/database_view.html

 

6. How to add a model for a database view? — Django ORM Cookbook 2.0 documentation

6. How to add a model for a database view? A database view is a searchable object in a database that is defined by a query. Though a view doesn’t store data, some refer to a views as “virtual tables,” you can query a view like you can a table. A view

books.agiliq.com

 

댓글