在 SqlAlchemy 中如何在不同 table ORM 之间共享函数

In SqlAlchemy how to share function between different table ORM

我在 SqlAlchemy 中写了一些 table ORM,我想在它们之间共享共同的功能,这是我的 table ORM:

class RetailCampaignTemp(Base, Serialize, PrimaryField):
    __tablename__ = 'retail_campaign_temp'
    clicks = Column(INTEGER(11))
    id = Column(INTEGER(11), primary_key=True)

这是我的自定义函数:

class Serialize(object):
    def Serialize(self):
        return {c: getattr(self, c) for c in inspect(self).attrs.keys()}

class PrimaryField(object):

    @declared_attr
    def GetPrimaryField(cls):
        yield from (column for column in cls.columns if column.primary_key)  

当我调用 RetailCampaignTemp.GetPrimaryField() 时,它显示 'generator' object is not callable,这是什么意思?

这里的罪魁祸首是 @declared_attr 装饰器,它创建了 class 属性,而不是 class 方法 - 即表达式 RetailCampaignTemp.GetPrimaryField已经是 运行 函数体并返回结果生成器,并且 RetailCampaignTemp.GetPrimaryField() 正在尝试调用此生成器。

此装饰器旨在用于动态创建 sqlalchemy mapping/table 声明,例如通过恢复关系。从您的示例代码来看,情况似乎并非如此,那么您是否有任何理由不只是使用 python 的内置 @classmethod 呢?这将使您的调用 RetailCampaignTemp.GetPrimaryField() 有效。