2013-04-14 3 views
1

기존 데이터베이스에서 Python/Elixir 인터페이스를 이미 마쳤습니다. 저는 이제 Elixir를 삭제하고 모든 것을 SQLAlchemy로 옮기려고합니다. 아마도 가장 많이 선언적 메서드를 사용하고 싶을 것입니다.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>" 

답변

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'))