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
을 연장 할 수 있습니까?