我已经设置了金字塔网页。其中一个观点是这样的: -
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()
,但我想先彻底了解发生的事情。
答案 0 :(得分:2)
通常在迭代Query
实例时执行查询。 Query.all()
是从Query
迭代器构建列表的便捷方法。 (当您尝试加载过期的属性时,查询也会自动执行,但出于此答案的目的,请忽略这些。)
重要的是要注意,会话的更改在任何时候都不可见。默认情况下,SQLAlchemy确保在适当的时间刷新会话,以便在下一个查询中反映会话的更改。
在您的情况下,您应该从.all()
中的do_a_query()
返回结果,而不是自己返回查询。