2017-05-05 1 views
0

SQLAlchemy의 ORM을 사용하여 필자가 작성한 응용 프로그램에서 데이터베이스를 모델링하고 있습니다.sqlalchemy 열 확장 방법

내가 정기적으로해야 할 일 중 하나는 데이터 용 엑셀 시트를 긁는 것입니다. 이 시트에는 데이터베이스로 쉽게 임포트 할 수 있도록 제대로 이름 지정된 C 럼이 없습니다. 내 모델에 정보를 캡슐화하기 위해 sqlalchemy.schema.Column에 대한 확장을 만들었습니다. 다음은 정의의 관련 비트는 다음과 같습니다 이제

from sqlalchemy.schema import Column 


class ExcelColumn(Column): 

    def __init__(self, *args, excel_column_name=None, value_map=None, **kwargs): 
     super().__init__(*args, **kwargs) 
     self._excel_column_name = None 
     self._value_map = None 
     self.excel_column_name = excel_column_name 
     self.value_map = value_map 

    @property 
    def excel_column_name(self): 
     if self._excel_column_name is None: 
      return self.name 
     else: 
      return self._excel_column_name 

    @excel_column_name.setter 
    def excel_column_name(self, n): 
     self._excel_column_name = n 

    @property 
    def value_map(self): 
     return (lambda x: x) if self._value_map is None else self._value_map 

    @value_map.setter 
    def value_map(self, fn): 
     if callable(fn) or fn is None: 
      self._value_map = fn 
     else: 
      raise ValueError('ExcelColumn.value_map must be callable.') 

, 내가 ExcelColumn 대신 Column의를 사용하여 테이블을 정의 할 수 있습니다.

class TableA(Base): 
    column_a = ExcelColumn(Integer, excel_column_name='Column for [a]') 
    # not updated from Excel 
    updated_on = Column(DateTime(), default=datetime.datetime.now) 

정확히 의도 한대로 작동하며 가져 오기 기능을 사용하면 Excel 시트에서 정확한 열을 추출 할 수 있습니다.

>> TableA.__mapper__.c['column_a'].excel_column_name 
'Column for [a]' 

내가으로 실행하고 문제는 내가 어떤 테이블에 대한 몇 가지 일반적인 열이있는 믹스 인 클래스를 만드는 경우, 엑셀 열 정보를 잃을 것입니다. 내가 TableB을 검사 할 때

class Mixin(): 
    common_column = ExcelColumn(Integer, excel_column_name='Common Column "name"') 


class TableB(Mixin, Base): 
    column_b = ExcelColumn(Integer, excel_column_name='Coulmn of [b]') 

지금, 나는 그것이 common_column 정보를 잃은 것을 알 수있다.

>> TableB.__mapper__.c['common_column'].excel_column_name 
'common_column' 

는 어떻게 믹스 인 클래스를 사용할 때 너무 정보가 손실되지 않습니다 Column을 연장 할 수 있습니까?

답변

0

소스 코드를 파헤친 후에 copy 메서드를 재정의해야합니다. Column입니다. ExcelColumn 클래스에 다음 메소드를 추가하십시오.

def copy(self, **kwargs): 
    c = super().copy(**kwargs) 
    c._excel_column_name = self._excel_column_name 
    c._value_map = self._value_map 
    return c 
관련 문제