我刚刚注意到,在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(...)
我看不到任何其他方法可以做到这一点。
我也愿意接受“你不应该做这种事情,因为......”形式的回复。