2008-11-06 4 views
8

SQLAlchemy 0.5rc를 사용하고 있는데 릴레이션에 자동 필터를 추가하고 싶습니다. 그래서 그 릴레이션에 대한 레코드를 가져 오려고 할 때마다 "원격"플래그가 붙어 있으면 무시합니다 예를 들어, "부모"개체가 개의 레코드가있는 "자식"관계가 있고 그 중 하나가 논리적으로 삭제 된 경우 "자식"관계가 " 부모 "SQLA를 에게 두 명의 자식으로 부모 개체를 가져오고 싶습니다.
어떻게해야합니까? "와"조건을 주회에 추가함으로써 관계 매개 변수?SQLAlchemy를 사용하여 관계에 자동 필터를 추가하는 방법은 무엇입니까?

편집 (? 예를 들어 "Children.parent_id == Parent.id and Children.logically_deleted == False"하지만 올바른 이런 식으로 쓰기 "와"하는 것입니다) :
나는이 방법

children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False)) 

에 그것을 관리하지만 방법이 대신 primaryjoin으로 문자열을 사용 하시겠습니까?

답변

3

and_() 함수는 함께 & 연산자, SQLAlchemy의 논리 접속사를 할 수있는 올바른 방법이지만, 후자에주의 그것은 놀라운 우선 순위 규칙을 가지고 있기 때문에, 즉 비교 연산자보다 우선 순위가 높습니다.

text() 생성자와 함께 기본 조인으로 문자열을 사용할 수도 있지만 eagerloading 및 조인과 함께 제공되는 테이블 별칭을 사용하여 코드를 중단시킬 수 있습니다.

mapper(Something, select([sometable], sometable.c.deleted == False)) 
+0

__mapper_args__를 사용하여 번역 할 수 있습니까? 나는 선언적을 사용하고있다. – Marconi

+0

mapper_args에서 사용하려고했지만 "매퍼()가 키워드 인수 'local_table'에 대해 여러 값을 가져왔다"라는 오류 메시지가 나타납니다. 그래서 나는 그것이 쓸모없는 것이 아닌가 걱정된다. –

0

난 단지 현재 여기 전년도 0.4.something을 개발하지만,있어 내가 그것을 건의 할 것입니다 방법은 다음과 같습니다

db.query(Object).filter(Object.first==value).filter(Object.second==False).all() 

내가 그건 당신이 바로, 무엇을하려고 생각?

(참고 : 웹 브라우저에 기록하지 실제 코드를!)

+0

아니, 나는 뭔가 자동적으로 찾고 있었다. 나는 질문을 명확히 할 것이다. :) 고마워! – Joril

+0

걱정할 필요가 없습니다. 나는 당신이 무엇을하려고하는지 이해하고 있다고 생각하지만, 주로 당신이 제공 한 코드를 읽는 것입니다! –

6

대신 primaryjoin로 문자열을 사용하는 방법이있다 :

논리적 삭제를 들어, 삭제 된 값을 무시하는 선택을 통해 전체 클래스를 매핑하는 데 더 좋을 수 있을까요?

는 다음을 사용할 수 있습니다 : 이것은 나를 위해 일한

children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)" 

을!

관련 문제