SQLAlchemy查询 - 它们什么时候执行?

时间:2016-11-21 08:51:33

标签: python sqlalchemy pyramid

我已经设置了金字塔网页。其中一个观点是这样的: -

sql_list = do_a_query()
handle_a_post_request(request)
return dict(sql_list=sql_list)

def do_a_query():
    request.db.query(WhatIAmLookingFor)

(mako,但我认为这是不相关的)模板然后根据sql_list中的数据处理显示我的网页。

handle_a_post_request函数中,我根据post请求修改会话(并运行commit())。这些修改会显示在结果页面中,这表明查询本身实际上已经运行了#39;或在我的模板中调用时执行。由于我使用mako,调用是使用: -

完成的
% for row in sql_list:
<tr>
    <td> ${row[0]} </td>
    <td> ${row[1]} </td>
    <td> ${row[2]} </td>
</tr>

我的结论是否正确?如果sqlalchemy查询确实已经实现了,那么在该点之后对会话的更改将不再显示在&#39;结果中。查询?或者我的理解在某个方面存在根本缺陷?

我担心的是,将来对do_a_query()功能的更改(例如,在显示之前对某些预处理的结果进行迭代)将改变我的网页的行为。当然&#39;权利&#39;答案只是提前移动handle_a_post_request(),但我想先彻底了解发生的事情。

1 个答案:

答案 0 :(得分:2)

通常在迭代Query实例时执行查询。 Query.all()是从Query迭代器构建列表的便捷方法。 (当您尝试加载过期的属性时,查询也会自动执行,但出于此答案的目的,请忽略这些。)

重要的是要注意,会话的更改在任何时候都不可见。默认情况下,SQLAlchemy确保在适当的时间刷新会话,以便在下一个查询中反映会话的更改。

在您的情况下,您应该从.all()中的do_a_query()返回结果,而不是自己返回查询。