SQLAlchemy 查询 - 它们何时执行?

Ng *_*-Ee 6 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)
Run Code Online (Sandbox Code Playgroud)

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

handle_a_post_request函数中,我根据发布请求修改会话(并运行 commit())。这些修改显示在结果页面中,这表明查询本身在我的模板中被调用时实际上“运行”或执行。由于我使用的是 mako,因此调用是使用以下方法完成的:-

% for row in sql_list:
<tr>
    <td> ${row[0]} </td>
    <td> ${row[1]} </td>
    <td> ${row[2]} </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

我的结论正确吗?sqlalchemy 查询究竟何时“实现”,以便在那之后对会话的更改不再显示在查询的“结果”中?还是我的理解在某处存在根本性的缺陷?

我担心的是,将来对该do_a_query()函数的更改(例如,在显示之前迭代其结果以进行某些预处理)将改变我的网页的行为。当然,“正确”的答案只是提前行动handle_a_post_request(),但我想先彻底了解正在发生的事情。

uni*_*rio 9

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

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

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