6

외래 키인 필드로 필터링 된 클래스의 인스턴스를 가져 오려고하지만이를 시도 할 때 항상 데이터베이스의 모든 항목을 가져옵니다. 기준과 일치하는 것.SqlAlchemy - ForeignKey로 정의 된 필드 필터링

간단한 관계 N : 1의 선언적 기반을 사용하는 몇 가지 클래스가 있다고 가정 해 보겠습니다. "ContainerClass"의 인스턴스에 속할 수

#!/usr/bin/python2.6 
class ContainerClass(declarativeBase): 
    __tablename__ = "container_classes" 
    _id = Column("id", Integer, primary_key=True) 
    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 


class WhateverClass(declarativeBase): 
    __tablename__ = "whatever_classes" 

    _id = Column("id", Integer, primary_key=True) 
    _total = Column("total", Integer) 
    _containerClassId = Column("container_class_id", Integer, ForeignKey("other_classes.id")) 

    _containerClass = relationship("ContainerClass", uselist=False) 

    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 
    total = sqlalchemy.orm.synonym('_total', descriptor=property(getTotal, setTotal)) 
    containerClassId = sqlalchemy.orm.synonym('_containerClassId', decriptor=property(getContainerClassId, setContainerClassId)) 
    containerClass = sqlalchemy.orm.synonym('_containerClass', descriptor=property(getContainerClass setContainerClass)) 

"WhateverClass"의 인스턴스 (각 ContainerClass는 WhateverClass의 여러 인스턴스를 가질 수) : 그와 같은 모델로했다. 관계가 잘 작동하는 것 같습니다. "ContainerClass"에 새로운 "WhateverClass"를 추가하면 whateverClass.containerClassId는 ContainerClass의 값을 올바르게 가져옵니다.

하지만 id == 5 인 "ContainerClass"에 속하는 "WhateverClass"인스턴스의 목록을 가져와야한다고 가정 해 봅시다.

내가 수행하려고 할 경우

from myClasses import WhateverClass 
session.query(WhateverClass.WhateverClass).filter(WhateverClass.WhateverClass.containerClass.id == 5).all() 

을 나는 데이터베이스에 저장된 WhateverClass의 모든 인스턴스, 아이디 ==로 ContainerClass에 연결되어뿐만 아니라 사람을 얻을 5

그러나 만약 내가 session.query (WhateverClass.WhateverClass) .filter (total < = 100) .all() "총"필드가 < = 100 인 WhateverClass의 인스턴스를 올바르게 가져옵니다.

저는 sqlalchemy의 초보자입니다. 가입 된 쿼리 또는 이와 비슷한 것을 사용해야합니까? 나는 그것이 복잡 할 수는 없다는 것을 알고 있지만, 적절한 해결책을 찾지 못했습니다. 나는 조인, 노동 조합을 시도했다 ... 그러나 (분명히) 나는 잘못된 것을하고있다.

내가 SqlAlchem ​​y의 0.6.6 파이썬 2.6을 사용하고

가 사전에 감사합니다 (단지의 경우는 관련이)!

답변

10

간단한 쿼리를 들어, 당신은 단지 직접 조회 할 수 있습니다

session.query(WhateverClass).join(ContainerClass).filter(ContainerClass.id == 5).all() 
+0

내가 그 솔루션으로 이상한 행동을 얻을 :

session.query(WhateverClass).filter(WhateverClass._containerClassId == 5).all() 

을 더 복잡한 관계를 들어, 당신은 가입이 필요합니다. 나는 여전히 데이터베이스에있는 "WhateverClass"의 모든 인스턴스를 얻습니다. 그러나 whateverClassInstance.containerClassId를 출력하면 모든 인스턴스에 대해 "5"라고 표시됩니다. 하지만 그건 사실이 아닙니다 ... WhateverClass (s) 중 containerClassId == 5 (300 개 중 3 개) ... 300 개 인스턴스를 얻었고, 출력에 따라 300 개는 무엇이든지 있습니다 .ClassInstance .containerClassId == 5 ...하지만 MySQL 쿼리 브라우저가 말하는 것은 아닙니다.) 그래도 도와 ​​줘서 고마워. – BorrajaX

+1

업데이트 : 나는 어리 석다. 바보, 벙어리, 벙어리 ... 나는 내 데이터베이스의 모든 기록을 살펴 봤는데, 나는 생각보다 ContainerClass의 ContainClass에 더 많은 WhClass를 가지고 있었다. ! 게코에서 일하고 있었어! 다시 감사합니다... – BorrajaX

관련 문제