SQLAlchemy:如何遍历子查询中的bindparam值?

时间:2012-02-13 18:32:53

标签: python caching sqlalchemy subquery

我正在尝试使用SQLAlchemy Beaker Caching example中的_params_from_query函数提取SQLAlchemy查询参数值以用于缓存。

不幸的是,当我尝试使用涉及子查询的查询时,它似乎只遍历主查询参数,忽略子查询。

以下示例代码在从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

我是否错误地使用了该功能?如何从子查询中获取参数值?

1 个答案:

答案 0 :(得分: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