11

我对 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 缓存有几个问题,例如:

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

如何禁用 SQLAlchemy 缓存?

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

4

3 回答 3

16

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

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

于 2012-08-24T20:23:09.643 回答
2

几种可能。

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

一个通用的调试技巧:如果你想确切地知道 SQLAlchemy 在数据库中做什么,传递echo=Truecreate_engine函数。引擎将打印它运行的所有查询。

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

于 2012-08-24T13:20:21.390 回答
1

您需要将事务隔离级别更改为READ_COMMITTED http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#mysql-isolation-level

于 2018-05-27T06:06:57.627 回答