2014-07-10 4 views
3

선언 믹스 클래스에서 외래 키가있는 열을 선언 할 때 @declared_attr이 필요하다는 것을 알고 있습니다. 그러나이 이유를 알고 싶습니다. sqlalchemy, mixins, foreignkeys 및 declared_attr

감사합니다 :)

#store traces 
class ListContainer(): 
     id = Column(Integer, primary_key=True) 
     # timestamp = Column(DateTime, default=datetime.now()) 
     name = Column(String) 
#endclass 

#store flow in traces 
def list_item(tablename): 
     class ListItem(): 
#    @declared_attr 
#    def trace_id(cls): 
#      return Column(Integer, ForeignKey(tablename+'.id')) 
       trace_id = Column(Integer, ForeignKey(tablename+'.id')) 
       id = Column(Integer, primary_key=True) 
       item_pos = Column(Integer) 
       # start_ea = Column(BLOB) 
       # end_ea = Column(BLOB) 
     #endclass 
     return ListItem 
+3

[열에서 혼합하기] (http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/declarative.html?highlight=declared_attr#mixing-in-columns) 문서 (4 번째 및 5 번째 단락 링크). – van

+0

[열에서 믹싱] (http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/mixins.html#mixing-in-columns) 업데이트 된 링크. –

답변

3

각 모델 고유 ORM 속성이 있어야합니다. mixin의 동일한 속성이 각 서브 클래스에 직접 적용되면 모두 동일한 속성을 갖습니다. 기본적인 orm 속성의 복사본은 다른 orm 속성을 참조하지 않기 때문에 쉽게 만들 수 있습니다. 보다 복잡한 속성의 경우, @declared_attr으로 장식 된 함수는 각 서브 클래스마다 새 인스턴스가 작성되도록합니다.

계측 중에 SQLAlchemy는 각 클래스에 대해 선언 된 각 attr을 호출하여 결과를 대상 이름에 할당합니다. 이 방법으로 각 서브 클래스에 대해 고유하게 올바르게 매핑되는 복잡한 매핑을 보장 할 수 있습니다.

documentation을 참조하십시오.