1

我刚刚注意到,在stackoverflow 的回复中,sqlalchemy 的创建者 Mike Bayer (zzzeek) 说:“对于简单的用例,Declarative 不需要自定义元类,对于硬用例也几乎不需要。混合 + 自定义基础应该几乎可以做任何事情。” 这提高了我的希望,即我在 sqlalchemy 中使用自定义元类declarative_base所做的事情可以使用 mixins + 自定义基础来完成。但是,我无法使其工作。我将不胜感激任何提示!

我有一个 mixin ConciseRelationshipMixin,可以使用简洁的语法创建关系。它的用法如下:

class Eggs(ConciseRelationshipMixin, OtherMixin1, OtherMixin2):
    pass

Spam = declarative_base(cls=Eggs)

class Ham(Spam):
    some_column = Column(Integer)
    crispy_bacon = ConciseRelationship(Bacon)

这将创建一个额外的列Ham.__table__来保存关系的 FK,以及名称下的关系本身Ham.bar,使用项目特定的约定来命名额外列的名称和primaryjoin. 我真的很喜欢这个 mixin,因为它使Ham外观的定义非常清晰和整洁。

如果不使用元类,我无法实现这一点的原因是我试图将分配转换crispy_bacon = ...两个分配column_for_crispy_bacon = Column(...),并且crispy_bacon = relationship(...)我看不到任何其他方法可以做到这一点。

我也愿意接受“你不应该做这种事情,因为......”形式的回复。

4

0 回答 0