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

SQLAlchemy queries - when do they execute?

我有一个金字塔网页设置。其中一个视图做这样的事情:-

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())。这些修改显示在生成的页面中,这向我表明查询本身实际上 'runs' 或在我的模板中调用时执行。由于我使用的是 mako,调用是使用以下方法完成的:-

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

我的结论正确吗? sqlalchemy 查询 'actualized' 的确切时间是什么时候,使得在该点之后对会话的更改不再显示在查询的 'result' 中?还是我的理解存在根本性缺陷?

我担心的是,将来对 do_a_query() 函数的更改(例如,在显示之前迭代其结果以进行一些预处理)将改变我的网页的行为。当然'right'的回答只是为了让handle_a_post_request()更早一点,但我想先彻底了解发生了什么。

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

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

在您的情况下,您应该 return 在 do_a_query().all() 的结果,而不是 return 查询本身。