2012-02-13 3 views
1

SQLAlchemy Beaker Caching example_params_from_query 함수를 사용하여 캐싱에 사용할 SQLAlchemy 쿼리 매개 변수 값을 추출하려고합니다.SQLAlchemy : 하위 쿼리에서 bindparam 값을 트래버스하는 방법?

아쉽게도 하위 쿼리와 관련된 쿼리를 사용하려고하면 하위 쿼리를 무시하고 주 쿼리 매개 변수를 통과하는 것으로 보입니다.

다음 예제 코드는 SQLAlchemy 배포본의 beaker_cache 예제 폴더에서 실행할 때이를 보여줍니다.

from environment import Session 
from model import Person 
from caching_query import _params_from_query 

s = Session.query(Person.name).filter(Person.name=="subquery value").subquery() 

q = Session.query(s.c.name).filter(s.c.name=="main query value") 

print q.params() 
print 
print _params_from_query(q) 

# SELECT anon_1.name AS anon_1_name 
# FROM (SELECT person.name AS name 
# FROM person 
# WHERE person.name = :name_1) AS anon_1 <- two 
# WHERE anon_1.name = :name_2    <- parameters 
# 
# ['main query value'] <- only one value 

기능을 잘못 사용하고 있습니까? 하위 쿼리에서 매개 변수 값을 얻으려면 어떻게해야합니까?

답변

3

이것은 예에서 버그입니다. 모든 것을 얻을 수있는 해결 방법이 있습니다 (전체 문장 컴파일이 필요하지 않도록 개선하고 싶지만) :

diff -r affaa93fad92 examples/beaker_caching/caching_query.py 
--- a/examples/beaker_caching/caching_query.py Tue Feb 14 10:16:16 2012 -0500 
+++ b/examples/beaker_caching/caching_query.py Tue Feb 14 11:57:59 2012 -0500 
@@ -268,8 +268,5 @@ 
      value = bind.value 

     v.append(value) 
- if query._criterion is not None: 
-  visitors.traverse(query._criterion, {}, {'bindparam':visit_bindparam}) 
- for f in query._from_obj: 
-  visitors.traverse(f, {}, {'bindparam':visit_bindparam}) 
+ visitors.traverse(query.statement, {}, {'bindparam':visit_bindparam}) 
    return v 
+0

잘 작동합니다. 또한 나는''칼럼을 테이블에 놓고 계속 경고했기 때문에''traverse''를''경고를 잡는 블록 ''(http://stackoverflow.com/a/5225951/201665)에 싸기로 결정했다. . 같은 키를 가진 다른 컬럼으로 대체되고있다.''joinedload''를 포함하는 쿼리에 대해서. –

+1

아, 그렇게하지 않는 방법이 있습니다 ... 당신은 query.with_labels() 문을 말할 것입니다. 성명 – zzzeek

+0

환상적입니다, 고마워요! –

관련 문제