2014-03-06 2 views
1

SQLAlchemy를 사용하여 MySQL DB에 다형성 구조를 만드는 다음과 같은 파이썬 코드가 있습니다.수퍼 클래스에서 서브 클래스 인스턴스화

a = Animal(key=1) 
c = a.create() 

C 지금은 고양이 또는 그것이 무엇인지 종류에 따라 개 객체가 될 것입니다 :

class Animal(Base): 
    key = Column(Integer(), Sequence("My Counter" ,1 ,1), primary_key = True) 
    name = Column(String()) 
    discriminator = Column('type',String()) 
    __mapper_args__ = {'polymorphic_on':discriminator} 

    def __init__(self,key,name): 
     self.key = key 
     self.name = name 

class Cat(Animal): 
    __tablename__ = 'cat' 
    __mapper_args__ = {'polymorphic_identity':'cat'} 
    def walk(): 
     pass 

class Dog(Animal): 
    __tablename__ = 'dog' 
    __mapper_args__ = {'polymorphic_identity':'dog'} 

    def walk(): 
     pass 

나는 가장 좋은 방법은되도록로드 무엇인지 궁금 해서요. 동물 표에는이 정보가 있습니다.

감사

답변

1

이것은 sqlalchemy를 사용하여 데이터베이스를 조회하는 방법이 아닙니다. 특정 키에 대한 동물을 얻기 위해 당신이 할 필요가 수행하는 것입니다 :

my_key = 1 
a = session.query(Animal).get(my_key) 
# sqlalchemy will figure out the type automatically and will return object of proper class 
assert type(a) in (Cat, Dog,) 

하여 제공하는 모델이 불완전 있습니다. 아래의 내용은 완전한 작업 중 하나 여야합니다.

class Animal(Base): 
    __tablename__ = 'animal' 
    key = Column(Integer(), Sequence("My Counter" ,1 ,1), primary_key = True) 
    name = Column(String()) 
    discriminator = Column('type',String()) 
    __mapper_args__ = { 'polymorphic_on':discriminator, } 

    def __init__(self,key,name): 
     self.key = key 
     self.name = name 

class Cat(Animal): 
    __tablename__ = 'cat' 
    __mapper_args__ = {'polymorphic_identity':'cat'} 
    key = Column(Integer(), ForeignKey('animal.key'), primary_key = True) 

    def walk(self): 
     print "cat walking" 

class Dog(Animal): 
    __tablename__ = 'dog' 
    __mapper_args__ = {'polymorphic_identity':'dog'} 
    key = Column(Integer(), ForeignKey('animal.key'), primary_key = True) 

    def walk(self): 
     print "dog walking" 
+0

감사합니다. 나는 모두 작동하도록했습니다. 나는 단지 내가 다음과 같은 것을 할 수 있기를 바랐다. a = Animal (1) 그래서 나는 객체를 얻고 싶을 때마다 "session.query ..."를 쓸 필요가 없었다. – user1474424

0

난 정말 당신이 쓴이 적용하는 방법을 정확히 모르겠지만, 나는 비슷한 일을했다.

팩토리 함수를 만들려고합니다. 이것은 아마도 분리 될 수 있지만 아마 기본 클래스에있을 것입니다. 어쨌든 정적 함수 여야하므로 수업에 포함 시키려면 @staticmethod으로 선언하십시오.

두 번째로 __subclasses__ 방법에 액세스 할 수 있습니다. BaseClass.__subclasses__() 실제 하위 클래스 목록을 얻으려면 BaseClass. 필자의 경우, 특정 클래스 속성을 가진 서브 클래스를 찾고 그 init 함수를 호출했다.

관련 문제