从Elixir到SqlAlchemy声明,具有子继承的多态节点

时间:2013-04-14 17:24:42

标签: python sqlalchemy python-elixir

我已经在现有数据库上完成了我的python / Elixir接口。我现在正在考虑放弃Elixir并将所有内容都移到纯SQLAlchemy中,很可能想要使用Declarative方法。

我不确定从哪个特定的继承关系开始。我不认为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>"

2 个答案:

答案 0 :(得分: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'))

答案 1 :(得分:0)

这篇文章是从2009年开始的,但如果全部结账,那么接受的答案非常好,基本上也回答了我的问题:

Polymorphic Node Hierarchy in SqlAlchemy Declarative