SQLAlchemy에 대한 경험이 많지 않고 해결할 수없는 문제가 있습니다. 나는 검색을 시도했고 많은 코드를 시도했습니다. 이것은 내 클래스입니다 (가장 중요한 코드로 축소됨).
class Patient(Base):
__tablename__ = 'patients'
id = Column(Integer, primary_key=True, nullable=False)
mother_id = Column(Integer, ForeignKey('patients.id'), index=True)
mother = relationship('Patient', primaryjoin='Patient.id==Patient.mother_id', remote_side='Patient.id', uselist=False)
phenoscore = Column(Float)
어머니의 phenoscore가 (예를 들어) 인 모든 환자를 쿼리하고 싶습니다. == 10
말했듯이 많은 코드를 시도했지만 이해하지 못했습니다. 내 눈에 논리적으로 해결책은
patients = Patient.query.filter(Patient.mother.phenoscore == 10)
.mother.phenoscore
출력 할 때 각 요소에 액세스 할 수 있지만이 코드는이를 수행하지 않기 때문입니다.
관계의 속성으로 필터링 할 수있는 (직접) 가능성이 있습니까 (SQL 문 또는 추가 조인 문을 작성하지 않고), 이러한 종류의 필터가 두 번 이상 필요합니다.
쉬운 해결책이 없더라도 모든 답을 얻을 수있어서 기쁩니다.
답변
has()
관계 방법 사용 (더 읽기 쉬움) :
patients = Patient.query.filter(Patient.mother.has(phenoscore=10))
또는 가입 (일반적으로 더 빠름) :
patients = Patient.query.join(Patient.mother, aliased=True)\
.filter_by(phenoscore=10)
답변
join을 사용하여 relationsip을 쿼리해야합니다.
이 자체 참조 쿼리 전략 에서 예제를 얻을 수 있습니다.
답변
세션과 함께 사용했지만 관계 필드에 직접 액세스 할 수있는 다른 방법은
db_session.query(Patient).join(Patient.mother) \
.filter(Patient.mother.property.mapper.class_.phenoscore==10)
나는 그것을 테스트하지 않았지만 이것도 효과가 있다고 생각합니다.
Patient.query.join(Patient.mother) \
.filter(Patient.mother.property.mapper.class_.phenoscore==10)
답변
좋은 소식이 있습니다. 저는 최근 에 Django 에서처럼 “마법의”문자열 로 필터링 / 정렬을 제공하는 패키지를 만들었습니다. 이제 다음과 같이 작성할 수 있습니다.
Patient.where(mother___phenoscore=10)
특히 복잡한 필터의 경우 훨씬 더 짧습니다.
Comment.where(post___public=True, post___user___name__like='Bi%')
이 패키지를 즐기시기 바랍니다
https://github.com/absent1706/sqlalchemy-mixins#django-like-queries
답변
이것은 관계를 쿼리하는 방법에 대한보다 일반적인 대답입니다.
relationship(..., lazy='dynamic', ...)
이를 통해 다음을 수행 할 수 있습니다.
parent_obj.some_relationship.filter(ParentClass.some_attr==True).all()