【问题标题】:SQLAlchemy queries - when do they execute?SQLAlchemy 查询 - 它们何时执行?
【发布时间】:2017-04-04 14:29:41
【问题描述】:

我有一个金字塔网页设置。其中一个视图执行以下操作:-

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 函数中,我根据发布请求修改会话(并运行commit())。这些修改显示在结果页面中,这向我表明查询本身实际上“运行”或在我的模板中调用它时执行。由于我使用的是 mako,所以调用是使用:-

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

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

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

【问题讨论】:

标签: python sqlalchemy pyramid


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,所以任何开始迭代 Query 实例的东西都会执行查询?如果我迭代两次(两次迭代之间发生了一些事情)怎么办?
  • @NgOon-Ee 然后它会执行两个查询。如果您更改会话中的某些内容(添加实例、删除实例、更新实例),则默认情况下 SQLAlchemy 将在执行第二个查询之前进行必要的更改。如果 另一个事务 改变了某些东西,那么根据隔离级别,您可能会或可能不会看到这些更改。
  • 谢谢。所以我在这里的错误是想象Query 实例实际上是一组结果。感谢您的快速、中肯和准确的解释。
猜你喜欢
  • 2015-07-22
  • 2017-11-05
  • 2016-11-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2021-03-09
  • 2017-01-21
相关资源
最近更新 更多