2014-09-12 2 views
2

나는 계층 적 DB 구조를 가지고 있으며 여러 수준 (관계)의 필드에 필터를 사용하여 쿼리를 만들고 싶습니다. 여기SQLAlchemy : 여러 필드 관계를 필터링하는 방법은 무엇입니까?

는 클래스 선언의 예입니다 :

class cTransfer(Base): 
    __tablename__ = 'mesTransfer' 
    transferID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False) 
    quanID = Column(UNIQUEIDENTIFIER, ForeignKey('mesQuantum.quanID')) 
    quanObj = relationship('cQuantum', foreign_keys=[quanID], lazy='joined') 

class cQuantum(Base): 
    __tablename__ = 'mesQuantum' 
    quanID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False) 
    orderItemID = Column(UNIQUEIDENTIFIER, ForeignKey('mesOrderItem.orderItemID')) 
    orderItemObj = relationship('cOrderItem', foreign_keys=[orderItemID], lazy='joined') 

class cOrderItem(Base): 
    __tablename__ = 'mesOrderItem' 
    orderItemID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False) 
    orderID = Column(UNIQUEIDENTIFIER, ForeignKey('mesOrderHeader.orderID')) 
    orderHeaderObj = relationship('cOrderHeader', foreign_keys=[orderID], lazy='joined') 

내가 누구의 관련 주문 ID 일부 목록에있는 모든 cTransfer를 가져 싶습니다.

그래서 나는이 작업을 수행하려고 :

"나도 'InstrumentedAttribute'객체가 아니다 cTransfer.quanObj과 관련된 '비교기'개체 속성 'orderItemObj'이 없다"

q = session.query(cTransfer).filter(cTransfer.quanObj.orderItemObj.orderID.in_([1, 2])) 

나는 예외가 이러한 쿼리를 어떻게 수행 할 수 있습니까?

답변

4

다음은 도움이됩니다. 기본적으로, 당신은 모든 레벨을 통해 join의를 수행해야합니다

orderIDs = [1, 2] 
q = (session.query(cTransfer) 
    .join(cTransfer.quanObj) 
    .join(cQuantum.orderItemObj) 
    .filter(cOrderItem.orderID.in_(orderIDs)) 
    .options(contains_eager(cTransfer.quanObj).contains_eager(cQuantum.orderItemObj)) 
    ) 

options 라인는 joined -loaded에 SQL에 추가 JOIN의 추가하지 않도록 관계가 이미로드되었는지 sqlalchemy에 힌트 관계.

+0

그게 전부 야! 고마워요! :) –

관련 문제