如何扩展sqlalchemy列

2024-10-02 04:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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来定义表。在

^{pr2}$

这完全符合我的预期,并且我的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类时不会丢失信息?在


Tags: nameselfnone信息mapifvaluedef
1条回答
网友
1楼 · 发布于 2024-10-02 04:24:30

在翻阅了源代码之后,我发现有必要重写copycopy方法。将以下方法添加到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

相关问题 更多 >

    热门问题