我刚刚注意到在a stackoverflow reply sqlalchemy的创建者Mike Bayer(zzzeek)说“简单用例的Declarative不需要自定义元类,而且对于硬用例也几乎不需要。 Mixins +定制基地应该能够做到的一切。“这使我希望我在sqlalchemy中使用declarative_base
的自定义元类进行的操作可以使用mixins + custom bases来完成。但是,我无法使其发挥作用。我非常感谢任何提示!
我有一个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(...)
和{{1} },我看不到任何其他方法。
我也愿意接受“你不应该做这种事,因为......”的回复。