我正在尝试使用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
我是否错误地使用了该功能?如何从子查询中获取参数值?
答案 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