如何避免在sqlalchemy中缓存?

时间:2012-08-24 11:51:34

标签: python sqlalchemy

我对SQL Alchemy有一个问题 - 我的应用程序可以作为一个不断运行的python应用程序。

我的功能如下:

def myFunction(self, param1):
   s = select([statsModel.c.STA_ID, statsModel.c.STA_DATE)])\
                        .select_from(statsModel)

   statsResult = self.connection.execute(s).fetchall()

   return {'result': statsResult, 'calculation': param1}

我认为这是一个明显的例子 - 一个结果集是从数据库中提取的,第二个是作为参数传递的。

问题在于,当我更改数据库中的数据时,此函数仍会返回数据,例如没有更改。当我在输入参数中更改数据时,返回的参数“计算”具有适当的值。

当我重新启动应用服务器时,情况恢复正常 - 从MySQL获取新数据。

我知道有几个关于SQLAlchemy缓存的问题,如:

How to disable caching correctly in Sqlalchemy orm session?

How to disable SQLAlchemy caching?

但我怎么称呼这种情况呢?似乎SQLAlchemy保留之前获取的数据,并且在应用程序重新启动之前不执行新查询。我该如何避免这种行为?

3 个答案:

答案 0 :(得分:14)

调用session.expire_all()将从会话中逐出所有数据库加载的数据。随后对对象属性的任何访问都会发出新的SELECT语句并返回新数据。有关背景信息,请参阅http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiring

如果您在致电expire_all()后仍然看到所谓的“缓存”,那么您需要按照我上面链接的answer中所述关闭交易。

答案 1 :(得分:1)

一些可能性。

  1. 您正在重复使用session不正确或不正确的时间。最佳做法是在您提交后丢弃session,并在使用之前的最后一刻获取新的session。看似缓存的行为实际上可能是由于您的应用程序中session生命周期很长。
  2. 存活时间超过session的对象未合并到后续echo=True中。如果你没有将它们合并,“元数据”可能无法更新它们的状态。这更像是SQLAlchemy的ORM API的一个问题,到目前为止你还没有使用它。
  3. 您的更改未提交。你说他们是这样我们会假设这不是它,但如果没有其他途径解释它你可能想再看一遍。
  4. 一个常规调试提示:如果您想确切知道SQLAlchemy在数据库中正在做什么,请将create_engine传递给{{1}}函数。引擎将打印它运行的所有查询。

    同样check out this suggestion我向正在使用ORM且遇到交易问题的其他人提出了问题,这些问题解决了他们的问题而没有查明问题。也许它会帮助你。

答案 2 :(得分:0)

您需要将事务隔离级别更改为.header-links-mobile, .header-links-mobile ul { width :100%; } .header-links-mobile ul { flex-wrap: wrap; } http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#mysql-isolation-level