如何避免在sqlalchemy中缓存?

Arc*_*ius 8 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}
Run Code Online (Sandbox Code Playgroud)

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

问题是,当我更改数据库中的数据时,此函数仍会返回数据,就像没有更改任何内容一样.当我在输入参数中更改数据时,返回的参数"计算"具有适当的值.

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

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

如何在Sqlalchemy orm会话中正确禁用缓存?

如何禁用SQLAlchemy缓存?

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

zzz*_*eek 14

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

如果您在通话后仍然看到所谓的"缓存"expire_all(),那么您需要按照上面链接的答案中所述关闭交易.


wbe*_*rry 2

几种可能性。

  1. session不恰当地或在不恰当的时间重复使用了您的内容。最佳实践是在提交后扔掉你的session,并在使用前的最后一刻获得一个新的。看似缓存的行为实际上可能是由于session应用程序中的生命周期非常长。
  2. 存活时间超过 的对象session不会被合并到后续的session. 如果您不将它们合并回来,“元数据”可能无法更新它们的状态。这对于 SQLAlchemy 的 ORM API 来说更值得关注,到目前为止您似乎还没有使用它。
  3. 您的更改尚未提交。你说是这样,所以我们假设不是这样,但如果其他途径都无法解释这一点,你可能想再看一遍。

一个常规调试技巧:如果您想准确了解 SQLAlchemy 在数据库中执行的操作,请传递echo=True给该create_engine函数。引擎将打印它运行的所有查询。

另请查看我向其他正在使用 ORM 并遇到事务性问题的人提出的建议,该建议解决了他们的问题,但没有指出问题所在。也许它会对你有所帮助。