我正在使用SQLAlchemy的ORM在我编写的应用程序中为数据库建模。在
我需要经常做的一件事就是从Excel表格中获取数据。这些工作表没有正确命名的列,以便于导入数据库。为了用模型封装信息,我创建了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
来定义表。在
这完全符合我的预期,并且我的import函数能够从Excel表中挑选出精确的列。在
>> TableA.__mapper__.c['column_a'].excel_column_name
'Column for [a]'
我遇到的问题是,如果我为一些表创建一个mixin类,其中一些公共列会丢失信息。在
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]')
现在当我检查TableB
时,我发现它丢失了来自common_column
的信息。在
>> TableB.__mapper__.c['common_column'].excel_column_name
'common_column'
如何扩展Column
以便在使用mixin类时不会丢失信息?在
在翻阅了源代码之后,我发现有必要重写
copy
的copy
方法。将以下方法添加到ExcelColumn
类:相关问题 更多 >
编程相关推荐