在 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()
有效。
我在 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()
有效。