2012-02-13 11 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

それは素晴らしいです。私は警告を得るのを続けていたので、「警告をキャッチするブロック」(http://stackoverflow.com/a/5225951/201665)に「トラバース」をラップすることにしました。 '' joinedload''を含んだクエリであれば、同じキーで別のカラムに置き換えられます。 –

+1

ああ、それをしないようにする方法がある...あなたはquery.with_labels()と言うだろう。statement – zzzeek

+0

素晴らしい、ありがとう! –

関連する問題