sqlalchemy와의 관계에 자동 필터를 추가하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/267861

  •  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()

나는 그것이 당신이하려는 일이라고 생각합니다.

(참고 : 실제 코드가 아닌 웹 브라우저로 작성되었습니다!)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top