외래 키인 필드로 필터링 된 클래스의 인스턴스를 가져 오려고하지만이를 시도 할 때 항상 데이터베이스의 모든 항목을 가져옵니다. 기준과 일치하는 것.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을 사용하고
가 사전에 감사합니다 (단지의 경우는 관련이)!
내가 그 솔루션으로 이상한 행동을 얻을 :
을 더 복잡한 관계를 들어, 당신은 가입이 필요합니다. 나는 여전히 데이터베이스에있는 "WhateverClass"의 모든 인스턴스를 얻습니다. 그러나 whateverClassInstance.containerClassId를 출력하면 모든 인스턴스에 대해 "5"라고 표시됩니다. 하지만 그건 사실이 아닙니다 ... WhateverClass (s) 중 containerClassId == 5 (300 개 중 3 개) ... 300 개 인스턴스를 얻었고, 출력에 따라 300 개는 무엇이든지 있습니다 .ClassInstance .containerClassId == 5 ...하지만 MySQL 쿼리 브라우저가 말하는 것은 아닙니다.) 그래도 도와 줘서 고마워. – BorrajaX
업데이트 : 나는 어리 석다. 바보, 벙어리, 벙어리 ... 나는 내 데이터베이스의 모든 기록을 살펴 봤는데, 나는 생각보다 ContainerClass의 ContainClass에 더 많은 WhClass를 가지고 있었다. ! 게코에서 일하고 있었어! 다시 감사합니다... – BorrajaX