【问题标题】:SQLAlchemy: How to traverse bindparam values in a subquery?SQLAlchemy:如何在子查询中遍历 bindparam 值?
【发布时间】:2012-03-05 04:08:18
【问题描述】:

我正在尝试使用 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

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

【问题讨论】:

    标签: python caching sqlalchemy subquery


    【解决方案1】:

    这是示例中的一个错误。这是一个应该得到所有东西的解决方法(尽管我想改进它以不需要完整的语句编译):

    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
    

    【讨论】:

    • 效果很好。我还决定将traverse 包装在block that catches warnings 中,因为对于包含joinedload 的任何查询,我不断收到警告Column ... on table ... being replaced by another column with the same key.
    • 哦,有办法让它不这样做......你会说 query.with_labels().statement
    猜你喜欢
    • 2016-04-02
    • 2021-09-12
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多