如何扩展sqlalchemy列

时间:2017-05-05 13:59:49

标签: python sqlalchemy

我正在使用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类时不会丢失信息?

1 个答案:

答案 0 :(得分:0)

在深入挖掘源代码后,我发现有必要覆盖Column的{​​{1}}方法。将以下方法添加到copy类:

Column