Learn/Company

[TIL #12] excel <-> db 함수 작성하기!

HannaDev 2022. 2. 23. 22:32

 

오늘은 어제 주어졌던 함수 작성 Mission 을 마무리하고 체크받는 시간을 가졌습니다.

아직 신입인 만큼 코드 자체보다는 Flask, SQLAlchemy 의 사용법을 스스로 익힐 수 있는가,

코딩 스타일이 어떠한가를 확인하고자 해당 Mission 을 주셨다고 하셨습니다!

 

어제는 회사 db 를 SQLAlchemy 로 쿼리를 날리는데 삽질을 많이 했지만

다행히 오전 중에 감을 잡아 함수 작성을 마무리했습니다.

리드 개발자님께 체크받기 전에 함수 작성을 마무리해서 정말 다행입니다. (*ˊᵕˋ*)ノ

 

아래에 작성한 문서는 오늘 작성한 Python 코드를 문서화 해 본 문서입니다.

아직은 코드를 어떻게 문서화해야 할 지 잘 감이 안 잡히네요... ㅎㅎ;;;

내일부터는 실제 업무를 할당해주신다고 하셨는데

문서화도 꾸준히 연습해야겠습니다! _〆(。。)​

 


 


0. Mission

 

▶ 개요

회사 Github 레포지토리 develop 브랜치에서 새로운 feature 브랜치 생성.

① excel to db

② db to excel

이 후 회사 db 와 excel 을 연결하는 2개의 함수를 작성하라.

- 작성 위치 : 회사 Github 레포지토리
- Target File : CP 의 정산 정보가 담겨 있는 엑셀 파일이 주어짐.
- DB Table : 윌라 DB 내 테스트용 ‘excel_import_test’ 테이블 생성.
 
  • 터미널에서 해당 Python 파일을 실행하는 방법 (테스트 진행 시 활용)
$ export FLASK_CONFIG=development; export ELASTICSEARCH_DISABLE=true;
  python -u manage.py <실행할_파이썬_스크립트_파일명> -<옵션키> "옵션_값"

 

▶ 핵심 포인트

  • '회사 Github 레포지토리 = 회사 코드' 내에서 작성한 함수 코드가 연동되어 돌아가야 한다.
  • 회사 코드에 대한 이해도 필요 (Flask, SQLAlchemy…)

 

▶ 작성한 Python 파일 - 3개의 파일로 분리

  • create_cp_db_model.py
    • class ExcelData :
    • class ExcelSchema(ma.Schema) :
    • class CPModel(db.Model) :
  • create_cp_db_to_excel.py
    • def run(self, **options):
    • def parse_excel(self, path: str) -> dict:
    • def get_data(self, main_sheet) -> list:
  • create_cp_excel_to_db.py
    • def run(self, **options):
    • def get_data(self) -> list:
    • def create_excel(self, path: str, data: [ExcelData]) -> bool:

 

1. create_cp_db_model.py

 
  • class CPModel(db.Model) :
class CPModel(db.Model):
    """ excel 데이터 DB 모델 """
    __tablename__ = 'excel_import_test'
    
    ...
    
    def __init__(self, cp_name, sum_first_20, sum_second_20, 
                 sum_first_21, sum_7_21, sum_8_21, settlement_period):
      ...
    
    def __str__(self) -> str:
      """ CP 관련 정보들을 가독성 높은 형태의 문자열로 반환한다. """
      ...
  • class ExcelData:
class ExcelData:
    """ excel 데이터를 담을 class """
    
    ...
    
    def __str__(self) -> str:
        ...
        
    def check_int_validation(self):
        """ CP 정산 정보들을 int or None 으로 만든다. """
    
    @staticmethod
    def _get_int_value(target_obj):
        """ float or None 형태로 들어오는 정산 정보를 int or None 으로 반환한다. """
  • class ExcelSchema(ma.Schema):
    • marshmellow 를 사용한 Excel 데이터를 담을 class (추가 학습 필요)
    • 작성한 코드에서는 사용되지 않는다.
    • 해당 클래스 대신 ExcelData 클래스에 Excel 데이터를 담았지만
      실무적으로는 marshmellow 를 사용한다.

 

2. create_cp_excel_to_db.py

 

  • ‘--path’ or ‘-p’ 옵션을 통해 데이터를 읽을 Excel 파일 경로를 입력해야 한다.
$ Export FLASK_CONFIG=development; ELASTICSEARCH_DISABLE=true;
  python -u manage.py create_cp_excel_to_db -p “(파일경로)”​
  • 해당 Excel 데이터를 파싱해 excel_import_test 테이블에 데이터를 저장한다.
class Command(BaseCommand):

    option_list = (
        Option('--path', '-p', type=str, help='정산파일경로'),
    )

    def run(self, **options):
        """ path 경로의 excel 파일을 읽어 db excel_import_test 테이블에 저장 """
        ...
    
    def parse_excel(self, path: str) -> dict:
        """ path 경로의 excel 파일을 파싱 """
        ...
    
     def get_data(self, main_sheet) -> list:
        """ 지정된 시트의 excel 데이터를 파싱 -> 객체화 """
        ...​

 


3. create_cp_db_to_excel.py

 

  • ‘--path’ or ‘-p’ 옵션을 통해 데이터를 저장할 Excel 파일 경로를 입력해야 한다.
$ Export FLASK_CONFIG=development; ELASTICSEARCH_DISABLE=true;
  python -u manage.py create_cp_db_to_excel -p “(파일경로)”​
  • 해당 excel_import_test 테이블 데이터를 읽은 후 Excel 파일을 만들어 저장한다.
class Command(BaseCommand):

    option_list = (
        Option('--path', '-p', type=str, help='파일저장경로'),
    )

    def run(self, **options):
        """ db excel_import_test 테이블 데이터를 path 경로에 excel 파일로 저장 """
        ...
    
    def get_data(self) -> list:
        """ db excel_import_test 테이블에서 데이터를 가져옴 """
        ...

    def create_excel(self, path: str, data: [ExcelData]) -> bool:
        """ path 경로에 excel 파일 생성 """
        ...

 


대표이미지용 - SQLAlchemy