2016-07-20 14 views
3

내 모델에는 보조 모델의 관계 수인 column_property이 있습니다.부모로부터 서브 쿼리 분리하기

membership_total = column_property(
     select([func.count(MembershipModel.id)]).where(
      MembershipModel.account_id == id).correlate_except(None)) 

멤버십 모델에 가입 할 때까지 제대로 작동합니다.

query = AccountModel.query.join(MembershipModel) 
# ProgrammingError: subquery uses ungrouped column "membership.account_id" from outer query 

나는 추가하여이 문제를 해결할 수 있습니다 :

query = query.group_by(MembershipModel.account_id, AccountModel.id) 
# resolves the issue 

하지만 난 정말 그렇게하고 싶지 않아. 쿼리가 수행하는 작업을 무시하고 특정 행의 계정 ID에 대한 멤버 수를 반환하는 데 중점을 둡니다.

상위 쿼리가 수행하는 작업에 대한 의존성과 안정성을 높이기 위해 column_property에 수행 할 수있는 작업은 무엇입니까?

답변

2

설명문에 here과 같이 None 대신 MembershipModel에서 correlate_except()으로 전달하십시오. 현재 메서드는 하위 쿼리의 FROM 절이 모든 쿼리를 포함하는 쿼리와 상관 될 수있는 경우 모두 생략 할 수 있습니다. MembershipModel에 가입하면 둘러싼 쿼리에서 사용할 수있게됩니다.

다음은 간단한 예입니다. 모든 게 잘,

In [10]: A.b_count = column_property(
    select([func.count(B.id)]).where(B.a_id == A.id).correlate_except(B)) 

In [11]: A.b_count_wrong = column_property(
    select([func.count(B.id)]).where(B.a_id == A.id).correlate_except(None)) 

우리가 A를 조회 할 경우 : A

In [2]: class A(Base): 
    ...:  __tablename__ = 'a' 
    ...:  id = Column(Integer, primary_key=True, autoincrement=True) 
    ...:  

In [3]: class B(Base): 
    ...:  __tablename__ = 'b' 
    ...:  id = Column(Integer, primary_key=True, autoincrement=True) 
    ...:  a_id = Column(Integer, ForeignKey('a.id')) 
    ...:  a = relationship('A', backref='bs') 

2 column_property 정의 :이 개 모델 AB을 감안할 때

In [12]: print(session.query(A)) 
SELECT a.id AS a_id, (SELECT count(b.id) AS count_1 
FROM b 
WHERE b.a_id = a.id) AS anon_1, (SELECT count(b.id) AS count_2 
FROM b 
WHERE b.a_id = a.id) AS anon_2 
FROM a 

을하지만 우리가 참여하는 경우 B, 두 번째 속성은 포함 된 쿼리에서 B을 잘못 연결하고 FROM 절을 완전히 생략합니다.

In [13]: print(session.query(A).join(B)) 
SELECT a.id AS a_id, (SELECT count(b.id) AS count_1 
FROM b 
WHERE b.a_id = a.id) AS anon_1, (SELECT count(b.id) AS count_2 
WHERE b.a_id = a.id) AS anon_2 
FROM a JOIN b ON a.id = b.a_id 
+0

고마워요! 문서에도 정확한 사용 사례가있었습니다. –