Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:如何遍历子查询中的bindparam值?_Python_Caching_Sqlalchemy_Subquery - Fatal编程技术网

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

Python SQLAlchemy:如何遍历子查询中的bindparam值?,python,caching,sqlalchemy,subquery,Python,Caching,Sqlalchemy,Subquery,我试图使用函数_params_from_query从中提取SQLAlchemy查询参数值以用于缓存 不幸的是,当我尝试使用包含子查询的查询时,它似乎只遍历主查询参数,而忽略了子查询 下面的示例代码在从SQLAlchemy发行版中的烧杯缓存示例文件夹运行时演示了这一点 from environment import Session from model import Person from caching_query import _params_from_query s = Session.q

我试图使用函数_params_from_query从中提取SQLAlchemy查询参数值以用于缓存

不幸的是,当我尝试使用包含子查询的查询时,它似乎只遍历主查询参数,而忽略了子查询

下面的示例代码在从SQLAlchemy发行版中的烧杯缓存示例文件夹运行时演示了这一点

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

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

这是示例中的一个错误。这里有一个解决方案,可以解决所有问题,尽管我想改进它,使其不需要编译完整的语句:

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

这很有效。我还决定将遍历包装在一个文件夹中,因为我一直得到警告列。。。在桌子上。。。被具有相同键的另一列替换。对于任何包含joinedload.oh的查询,都有办法使其不包含joinedload.oh,您可以使用query.with_labels.statement