1

既存のデータベースでの python/Elixir インターフェースのかなりの部分はすでに完成しています。私は現在、Elixir をやめて、すべてを純粋な SQLAlchemy に移行することを検討しています。おそらく宣言型メソッドを使用したいと考えています。

この特定の継承関係をどこから始めればよいかさえわかりません。私は、sqlalchemy がこの方法で (または「魔法のように」) 継承を実行するとは思わず、sqlalchemy で同じことがどのように見えるか少し混乱しています。

これは、各クラスが独自のデータベース テーブルにマップされた、ポリモーフィックな複数テーブルの結合です。完了すると、別のクラス (ここには含まれていません) に「Comp」を持つ OneToMany が作成されます。Comp サブクラスには、Comp.id への外部キーである主キーがあります。

class Comp(Entity):
    using_options(inheritance='multi')
    parent = ManyToOne('Assembly', onupdate='cascade', ondelete='set null')
    quantity = Field(Numeric(4), default=1)

    def __repr__(self):
        return "<Comp>"

## If not familiar with Elixir, each of the following "refid" point to a different
## table depending on its class. This is the primary need for polymorphism.    

class CompAssm(Comp):
    using_options(inheritance='multi')
    refid = ManyToOne('Assembly', onupdate='cascade', ondelete='set null')

    def __repr__(self):
        return "<CompAssm>"

class CompItem(Comp):
    using_options(inheritance='multi')
    refid = ManyToOne('Item', onupdate='cascade')

    def __repr__(self):
        return "<CompItem>"

class CompLabor(Comp):
    using_options(inheritance='multi')
    refid = ManyToOne('Labor', onupdate='cascade')

    def __repr__(self):
        return "<CompLabor>"
4

1 に答える 1

0

これが大まかな方向性だと思いますが、まだ微調整が必​​要かもしれません。

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Assembly(Base):
    __tablename__ = 'assembly'
    assm_id = Column(Integer, primary_key=True)
    children = relationship('Comp')    

    ### other assembly stuff

class Comp(Base):
    __tablename__ = 'components'
    id = Column(Integer, primary_key=True)
    comp_type = Column('type', String(50))
    __mapper_args__ = {'polymorphic_on': comp_type}
    parent = Column(Integer, ForeignKey('assembly.assm_id'))
    quantity = Column(Integer)

class CompAssm(Comp):
    __tablename__ = 'compassm'
    __mapper_args__ = {'polymorphic_identity': 'compassm'}
    id = Column(Integer, ForeignKey('components.id'), primary_key=True)
    refid = Column(Integer, ForeignKey('assembly.assm_id'))

 class CompItem(Comp):
    __tablename__ = 'compitem'
    __mapper_args__ = {'polymorphic_identity': 'compitem'}
    id = Column(Integer, ForeignKey('components.id'), primary_key=True)
    refid = Column(Integer, ForeignKey('items.id'))

class CompLabor(Comp):
    __tablename__ = 'complabor'
    __mapper_args__ = {'polymorphic_identity': 'complabor'}
    id = Column(Integer, ForeignKey('components.id'), primary_key=True)
    refid = Column(Integer, ForeignKey('labors.id'))
于 2013-04-22T19:32:49.813 に答える