sqlalchemy와의 관계에 자동 필터를 추가하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
나는 sqlalchemy 0.5RC를 사용하고 있으며 관계에 자동 필터를 추가하여 해당 관계에 대한 레코드를 가져 오려고 할 때마다 "원격"이 "ongically_deleted로 표시되면"원격 "을 무시합니다. "(어린이 테이블의 부울 필드)
예를 들어, 객체 "부모"에 3 개의 레코드가있는 "어린이"관계가 있지만 그 중 하나가 논리적으로 삭제되는 경우, "부모"에 대해 쿼리 할 때 SQLA가 두 자녀와 함께 부모 객체를 가져 오기를 원합니다. .
어떻게해야합니까? 관계의 1 차 조인 매개 변수에 "및"조건을 추가함으로써? (예 : "Children.parent_id == Parent.id and Children.logically_deleted == False
",하지만 글을 쓰는 것이 맞습니까?"와 "이런 식으로?)
편집하다:
나는 이런 식으로 그것을했다
children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False))
그러나 대신 문자열을 1 차 연결으로 사용하는 방법이 있습니까?
해결책
and_ () 함수는 & 연산자와 함께 Sqlalchemy에서 논리적 연결을 수행하는 올바른 방법이지만, 후자는 놀라운 우선 순위 규칙, 즉 비교 연산자보다 우선 순위가 높기 때문에주의하십시오.
문자열을 Text () 생성자와의 1 차 조인으로 사용할 수도 있지만, 이로 인해 열망하는 모든 테이블 별명으로 코드를 중단시킬 수 있습니다.
논리적 삭제의 경우 삭제 된 값을 무시하는 선택을 통해 전체 클래스를 매핑하는 것이 좋습니다.
mapper(Something, select([sometable], sometable.c.deleted == False))
다른 팁
그러나 대신 문자열을 1 차 연결으로 사용하는 방법이 있습니까?
다음을 사용할 수 있습니다.
children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)"
이것은 나를 위해 효과가있었습니다!
나는 현재 0.4를 다시 개발하고 있지만 여기에 제안하는 방법은 다음과 같습니다.
db.query(Object).filter(Object.first==value).filter(Object.second==False).all()
나는 그것이 당신이하려는 일이라고 생각합니다.
(참고 : 실제 코드가 아닌 웹 브라우저로 작성되었습니다!)