我正在使用SQLAlchemy的ORM来为我正在编写的应用程序中的数据库建模。
我需要定期做的一件事就是抓取一些Excel表格来获取数据。这些工作表没有正确命名的列,以便于导入数据库。为了用我的模型封装信息,我创建了var value = someList.FirstOrDefault(item => /* some predicate */)?.Value;
的扩展。以下是定义的相关部分:
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
这完全符合我的预期,我的导入功能可以从Excel工作表中挑选出要提取的确切列。
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)
我遇到的问题是,如果我为某些表创建一个带有一些常用列的mixin类,则excel列会丢失信息。
>> TableA.__mapper__.c['column_a'].excel_column_name
'Column for [a]'
现在,当我检查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'
以便在使用mixin类时不会丢失信息?
答案 0 :(得分:0)
在深入挖掘源代码后,我发现有必要覆盖Column
的{{1}}方法。将以下方法添加到copy
类:
Column