1. 데이터 관리방식 변경

  • 기존의 테이블 모델은 DB의 쿼리 결과로 얻은 객체를 리스트형태로 가져와 2차원 리스트 형태로 관리
  • 인덱싱은 편하지만 모델을 사용하는 의미가 희박해지고 수정사항을 DB에 반영하는 것도 비효율적

  • 모델에 getter, setter 추가
    # 화주별 일일정산 데이터 모델
    class DayCalOwnerValues(Base):
        __tablename__ = 'daycal_owner_values'
        date = Column(Date, primary_key=True)
        owner_id = Column(Integer, primary_key=True)
        owner_name = Column(String, nullable=False)
        kd_total = Column(Integer, nullable=False)
        kd_fare = Column(Integer, nullable=False)
        kd_drop = Column(Integer, nullable=False)
        kd_fee4 = Column(Integer, nullable=False)
        after_deduction = Column(Integer, nullable=False)
        match_fee5 = Column(Integer, nullable=False)
        owner_fare = Column(Integer, nullable=False)
        owner_drop = Column(Integer, nullable=False)
        listing_fee4 = Column(Integer, nullable=False)
        kd_pre = Column(Integer, nullable=False)
        deduction_total = Column(Integer, nullable=False)
        total_include_pre = Column(Integer, nullable=False)
    
        def __init__(self, date, owner_id, owner_name):
            self.date = date
            self.owner_id = owner_id
            self.owner_name = owner_name
            self.kd_total = 0
            self.kd_fare = 0
            self.kd_drop = 0
            self.kd_fee4 = 0
            self.after_deduction = 0
            self.match_fee5 = 0
            self.owner_fare = 0
            self.owner_drop = 0
            self.listing_fee4 = 0
            self.kd_pre = 0
            self.deduction_total = 0
            self.total_include_pre = 0
    
        def get(self, idx):
            if idx == 0:
                return self.kd_total
            elif idx == 1:
                return self.kd_fare
            elif idx == 2:
                return self.kd_drop
            elif idx == 3:
                return self.kd_fee4
            elif idx == 4:
                return self.after_deduction
            elif idx == 5:
                return self.match_fee5
            elif idx == 6:
                return self.owner_fare
            elif idx == 7:
                return self.owner_drop
            elif idx == 8:
                return self.listing_fee4
            elif idx == 9:
                return self.kd_pre
            elif idx == 10:
                return self.deduction_total
            elif idx == 11:
                return self.total_include_pre
    
        def set(self, idx, val):
            if idx == 0:
                self.kd_total = val
            elif idx == 1:
                self.kd_fare = val
            elif idx == 2:
                self.kd_drop = val
            elif idx == 3:
                self.kd_fee4 = val
            elif idx == 4:
                self.after_deduction = val
            elif idx == 5:
                self.match_fee5 = val
            elif idx == 6:
                self.owner_fare = val
            elif idx == 7:
                self.owner_drop = val
            elif idx == 8:
                self.listing_fee4 = val
            elif idx == 9:
                self.kd_pre = val
            elif idx == 10:
                self.deduction_total = val
            elif idx == 11:
                self.total_include_pre = val​
     
    • 모든 모델 클래스에 get, set 메소드를 위와같이 추가. 
    • 테이블 모델에서의 참조를 용이하게 하기 위해서 위 처럼 인덱스를 사용한 get, set을 구현

  • db액션 수정
    # 화주 명단 가져오기
    def get_daycal_owner_list():
        return session.query(DayCalOwner).order_by(DayCalOwner.id).all()
    
    
    # 화주별 데이터 가져오기
    def get_daycal_owner_values(today = None):
        if today:
            return session.query(DayCalOwnerValues).filter(DayCalOwnerValues.date == today).order_by(DayCalOwnerValues.owner_id).all()
    
        today = date.today()
        values = []
        owner_list = get_daycal_owner_list()
        for owner in owner_list:
            id = owner.get(0)
            name = owner.get(1)
            value = session.query(DayCalOwnerValues).filter(and_(DayCalOwnerValues.owner_id == id, DayCalOwnerValues.date == today)).first()
            if not value:
                value = DayCalOwnerValues(today, id, name)
                session.add(value)
                session.commit()
            values.append(value)
        return values
    
    
    # 기타 데이터 가져오기
    def get_daycal_other_values(today = date.today()):
        value = session.query(DayCalOtherValues).filter(DayCalOtherValues.date == today).first()
        if not value:
            value = DayCalOtherValues(today)
            session.add(value)
            session.commit()
        return value
    
    
    # 결과 데이터 가져오기
    def get_daycal_result(today = date.today()):
        value = session.query(DayCalResult).filter(DayCalResult.date == today).first()
        if not value:
            value = DayCalResult(today)
            session.add(value)
            session.commit()
        return value​
    • DB에서 쿼리를 통해 가져온 객체를 to_list를 호출하여 컬럼값이 들어있는 리스트의 형태로 반환하는
      기존의 방식에서 객체 자체를 반환하는 방식으로 변경.

  • 테이블 모델 수정
        def data(self, index, role):
            if index.isValid():
                if role == Qt.DisplayRole:
                    value = self.table_data[index.column()].get(index.row())
                    return format(value, ',')
                elif role == Qt.EditRole:
                    value = self.table_data[index.column()].get(index.row())
                    return value
                elif role == Qt.TextAlignmentRole:
                    return int(Qt.AlignRight | Qt.AlignVCenter)
    
        def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...):
            if role == Qt.DisplayRole:
                if orientation == Qt.Horizontal:
                    return self.owner_list[section].get(1)
                else:
                    return self.vertical_header[section]
            return None
            
        def setData(self, index: QModelIndex, value: int, role):
            if role == Qt.EditRole:
                r, c = index.row(), index.column()
                self.changed(r, c, self.table_data[c].get(r), value)
                self.table_data[c].set(r, value)
                return True
            return False​
     
    • 기존에 2차원 리스트 형태였던 데이터들이 객체의 배열로 변경되면서 참조 방식도 getter를 사용하도록 수정
    • 이렇게 객체를 직접 수정하는 방식을 사용하는 것으로 모델을 사용하는 의미도 퇴색되지 않으며
      저장기능의 구현도 훨씬 편해진다.

  • 저장 액션 구현
    def save():
        session.commit()​
    • 테이블에서 쿼리로 가져온 객체를 직접 수정하도록 변경한 덕분에 단순히 session.commit()을 호출하는 것으로
      모든 변경사항이 DB에 반영된다.

  • 저장 액션 메뉴와 툴바에 추가
            # 저장 액션 추가
            save_data = QAction(QIcon('src/img/save_icon.png'), '저장하기', self)
            save_data.setShortcut('Ctrl+S')
            save_data.setStatusTip('화주 이름 변경')
            save_data.triggered.connect(actions.save)
            file_menu.addAction(save_data)
            tool_bar.addAction(save_data)​
     
    • 액션을 메뉴와 툴바에 추가하고 단축키를 Ctrl+S 로 지정, 아이콘파일을 구하여 설정해준다.

 

이제 데이터를 입력하고 저장기능을 사용하면 애플리케이션을 종료하고 다시 실행해도 작성한 오늘의 데이터가 
표시되는 것을 볼 수 있다.

+ Recent posts