スタックオーバーフローの返信で、 sqlalchemyの作成者であるMike Bayer(zzzeek)が、「Declarativeでは、単純なユースケースではカスタムメタクラスは必要なく、ハードユースケースでもほとんど必要ないことに気づきました。ミックスインとカスタムベースは必要です。ほとんどすべてを行うことができます。」これにより、カスタムメタクラスを使用してsqlalchemyで行っていたことが、declarative_base
代わりにミックスイン+カスタムベースを使用して実行できるという期待が高まりました。しかし、私はそれを機能させることができませんでした。ヒントをいただければ幸いです。
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
。私はこのミックスインが本当に好きです。なぜなら、それはHam
見た目の定義が非常に明確で整頓されているからです。
メタクラスを使用せずにこれを実装できなかった理由は、割り当てcrispy_bacon = ...
を2つの割り当てに変換しようとしているためですが、他の方法はありませんでした。column_for_crispy_bacon = Column(...)
crispy_bacon = relationship(...)
また、「こういうことをしてはいけないから……」という形での返信も受け付けています。