2016-11-21 63 views
1

我有一个金字塔网页设置。其中一个观点确实是这样的: -SQLAlchemy查询 - 它们何时执行?

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

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

的(灰鲭鲨,但我认为这是不相关的),那么模板处理基于在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查询“已实现”时,会在该点之后的会话更改不再显示在查询的“结果”中?或者我的理解在某个地方存在根本上的缺陷?

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

+0

我想你可能会遇到''autoflush'',看看这个:http://stackoverflow.com/questions/4201455/sqlalchemy-whats-the-difference-between-flush-and-commit –

+0

没有,肯定没有那个集合。 –

回答

1

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

请务必注意,在任何时候都无法更改会话。默认情况下,SQLAlchemy确保会话在适当的时候刷新,以便会话的更改反映在下一个查询上。

对你而言,你应该返回.all()的结果do_a_query()而不是返回查询本身。

+0

谢谢,所以任何开始遍历'Query'实例的东西都会执行查询?如果我遍历它两次(以及两次迭代之间发生的事情),该怎么办? –

+0

@ NgOon-Ee然后它会执行两个查询。如果在会话中更改某些内容(添加实例,删除实例,更新实例),则默认情况下,SQLAlchemy将在执行第二个查询之前进行必要的更改。如果*另一个事务*改变了某些东西,那么取决于隔离级别,您可能会看到或可能看不到更改。 – univerio

+0

谢谢。所以我的错误在于想象'Query'实例实际上是一组结果。感谢您快速,准确的解释。 –