출근 3주차! 슬슬... TIL 작성이 조금은 귀찮아지고 있습니다...
하지만 다시 초심으로! 열심히 작성해보겠습니다!
이번 주 월, 화에는 함수 작성 Mission 이 주어져서 해당 과제를 수행했습니다. (*ˊᵕˋ*)ノ
월요일 함수 작성은 쉬웠는데 화요일 함수 작성 미션은 어렵네요 ㅎㅎ;;;;
[월요일]
① 시간 값 변환 함수
- 파라미터는 총 3개
- 현재 시각 now, 시간 출력 포맷 string, [선택] 시간대 타입 UTC/KST
- 시간대 타입은 안 들어올 경우 Default = KST
- 파라미터에 따라 적절한 시간 정보를 Print 하라
- 만들어야 할 함수는 총 2개
- UTC → KST 변환 함수 1개
- 변환 함수를 이용한 시간 정보 출력 함수 1개
② 이메일 형식 체크 함수
- 파라미터로 들어온 문자열이 유효한 이메일 형식인지 판단하는 함수를 만들어라
- 유효성 여부 Print 하기
- 다양한 예외 처리가 필요할 것
- 여러 가지 상황을 자유롭게 상상하여 한 번 만들어보라
이렇게 2가지 함수를 작성하는 것이 Mission 이었습니다.
사실 함수 작성자체는 어려울 것이 없는 간단한 과제였는데요.
과제의 핵심 포인트는 다양한 예외 상황을 고려하며 Logical하게 고민,
실무에 적합한 코딩 스타일로 함수를 작성하는 것이었기 때문에
이것저것 상상할 여지가 많은 과제였습니다.
그래서 docstring 을 작성해보기도 하고 타입 체크 등 예외 처리를 추가하기도 하고
'파이썬 클린 코드' 책을 조금 읽어보면서 디테일들을 수정해보는 시간을 가졌습니다.
확실히 파이썬스럽게 프로그래밍하기 위해서는
PEP8 에 대한 이해도를 높이는 것이 중요할 것 같습니다!
[화요일]
회사 Github 레포지토리 develop 브랜치에서 새로운 브랜치 생성.
① excel to db
② db to excel
이 후, 이렇게 2가지 회사 db 와 excel 을 연결하는 함수를 작성하는 것이 Mission 이었습니다.
여기서 가장 핵심 포인트는 '회사 Github 레포지토리 = 회사 코드' 내에서
작성한 함수 코드가 연동되어 돌아가야 한다는 점인데요!
이 말은 즉 회사 코드에 대한 이해도가 필요하다는 말이며
회사 db 에 CRUD 를 날리기 위해 Flask 와 SQLAlcemy에 대한 이해도와
활용법을 숙지해야 된다는 말이기도 합니다. (두 개 모두 처음 접해보는....^ㅁ^)
그래서 excel 파싱 자체는 쉽게 완료했지만 회사 코드를 이해하고
db 커넥션을 만드는 데 어려움을 겪고 있습니다. ㅠㅁㅠ
신입 동기 두 분과 3시간 정도 db 와 싸움을 진행했는데
늪에 빠진 상태로 하루 일과를 마무리 하였습니다.
퇴근은 했지만... 오기가 생기네요!
내일은 db 와의 싸움에서 이기도록 하겠습니다!
업무 외적으로는 화요일 저녁에는 신입 동기 분들과 저녁 식사를 같이 했습니다.
커리어 고민을 같이 나누며 2차로 카페에도 갔는데요!
취업을 하던, 하지 않던 커리어 고민은 끝이 없는 것 같습니다 ㅠ.ㅠ
그래도 모두 '성장하고 싶다'라는 열정만은 같다고 느꼈습니다!
현실에 안주하지 않고 매 순간 성장할 수 있도록 열심히 고민해 나가겠습니다. ٩(˙ヘ˙)و
▶ 화요일 미완성 코드 (일단 SQLAlcemy 에 대한 공부가 필요)
- 별 짓 다해보는 중 ^ㅁ^...
from marshmallow import fields
from app.extensions import ma
from flask_script import Command as BaseCommand, Option
from openpyxl import load_workbook
from app import db
from app.util import kst_now
class Command(BaseCommand):
option_list = (
Option('--path', '-p', type=str, help='정산파일경로'),
)
def run(self, **options):
path = options.get('path')
if not path:
print(f'error - 정산파일경로 미입력.')
return
data = self.parse_excel(path)
for d in data:
print(d)
# self.render_pdf(data)
new_excel_data = CPSchema(data[0].cp_name,
data[0].sum_first_20,
data[0].sum_second_20,
data[0].sum_first_21,
data[0].sum_7_21,
data[0].sum_8_21,
data[0].settlement_period
)
print("\n>" * 5)
print("-" * 30)
print(new_excel_data)
db.session.add(new_excel_data)
db.session.commit()
def parse_excel(self, path: str) -> dict:
workbook = load_workbook(filename=path, data_only=True)
main_sheet = workbook.active
main_data = self.get_data(main_sheet)
workbook.close()
return main_data
def get_data(self, main_sheet) -> list:
main_data = []
start_col = 1
start_row = 2
for idx, row in enumerate(main_sheet.rows):
if idx < start_row:
continue
main = MainSchema()
main.cp_name = row[start_col].value
main.sum_first_20 = row[start_col+1].value
main.sum_second_20 = row[start_col+2].value
main.sum_first_21 = row[start_col+3].value
main.sum_7_21 = row[start_col+4].value
main.sum_8_21 = row[start_col+5].value
main.settlement_period = row[start_col+6].value
main.check_int_validation()
main_data.append(main)
return main_data
class MainSchema:
cp_name = ''
sum_first_20 = 0
sum_second_20 = 0
sum_first_21 = 0
sum_7_21 = 0
sum_8_21 = 0
settlement_period = ''
def __str__(self):
return f"{self.cp_name} | {self.sum_first_20} | {self.sum_second_20} | {self.sum_first_21}" \
f" | {self.sum_7_21} | {self.sum_8_21} | {self.settlement_period}"
def check_int_validation(self):
self.sum_first_20 = self._get_int_value(self.sum_first_20)
self.sum_second_20 = self._get_int_value(self.sum_second_20)
self.sum_first_21 = self._get_int_value(self.sum_first_21)
self.sum_7_21 = self._get_int_value(self.sum_7_21)
self.sum_8_21 = self._get_int_value(self.sum_8_21)
@staticmethod
def _get_int_value(target_obj):
return None if target_obj is None else round(target_obj)
class ExcelSchema(ma.Schema):
class Meta:
fields = (
'id',
'updated_at',
'created_at',
'creator_id',
'updater_id',
'is_active',
'cp_name',
'sum_first_20',
'sum_second_20',
'sum_first_21',
'sum_7_21',
'sum_8_21',
'settlement_period'
)
updated_at = fields.DateTime(format='%Y-%m-%dT%H:%M:%S+00:00')
created_at = fields.DateTime(format='%Y-%m-%dT%H:%M:%S+00:00')
creator_id = 2
updater_id = 2
is_active = 1
class CPSchema(db.Model):
__tablename__ = 'excel_import_test'
id = db.Column(db.Integer, primary_key=True, unique=True, autoincrement=True)
updated_at = db.Column(db.DateTime)
created_at = db.Column(db.DateTime)
creator_id = db.Column(db.BIGINT)
updater_id = db.Column(db.BIGINT)
is_active = db.Column(db.SMALLINT)
cp_name = db.Column(db.VARCHAR(20))
sum_first_20 = db.Column(db.BIGINT)
sum_second_20 = db.Column(db.BIGINT)
sum_first_21 = db.Column(db.BIGINT)
sum_7_21 = db.Column(db.BIGINT)
sum_8_21 = db.Column(db.BIGINT)
settlement_period = db.Column(db.VARCHAR(20))
def __init__(self, cp_name, sum_first_20, sum_second_20, sum_first_21, sum_7_21, sum_8_21, settlement_period):
self.updated_at = fields.DateTime(format='%Y-%m-%dT%H:%M:%S+00:00')
self.created_at = fields.DateTime(format='%Y-%m-%dT%H:%M:%S+00:00')
self.creator_id = 2
self.updater_id = 2
self.is_active = 1
self.cp_name = cp_name
self.sum_first_20 = sum_first_20
self.sum_second_20 = sum_second_20
self.sum_first_21 = sum_first_21
self.sum_7_21 = sum_7_21
self.sum_8_21 = sum_8_21
self.settlement_period = settlement_period
def __str__(self):
return f"{self.cp_name} | {self.sum_first_20} | {self.sum_second_20} | {self.sum_first_21}" \
f" | {self.sum_7_21} | {self.sum_8_21} | {self.settlement_period}"
최대한 회사 코드 이것저것 읽어보면서 db 연동 관련 내용을 훑어보고 있는데
역시 여러 사람이 합심해 만든 프로젝트를 읽어 나가기란 쉽지 않네요..._〆(。。)
docstring 이나 주석도 많지 않아서 일단 많이 보면서 drill down 하는 것이 중요할 것 같습니다!
'Learn > Company' 카테고리의 다른 글
[TIL #13] 3월 목표 세우기 (0) | 2022.03.02 |
---|---|
[TIL #12] excel <-> db 함수 작성하기! (0) | 2022.02.23 |
[TIL #9] 출근 2주차, 오늘은 교육이 두 번! + Toy Project 상상 (0) | 2022.02.19 |
[TIL #8] 서점에 간 날! (0) | 2022.02.18 |
[TIL #7] Monitoring, Logging 학습 + 트래커스 소모임 (0) | 2022.02.16 |