【问题标题】:How to avoid caching in sqlalchemy?如何避免在 sqlalchemy 中缓存?
【发布时间】:2012-08-19 23:44:24
【问题描述】:

我在使用 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 保留了之前获取的数据,并且在应用程序重新启动之前不会执行新查询。我怎样才能避免这种行为?

【问题讨论】:

  • 您如何更改数据库中的数据?是否已提交更改?
  • 我手动更改它。数据库引擎是 MySQL。是的,更改已提交。

标签: python sqlalchemy


【解决方案1】:

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

如果您在调用expire_all() 后仍然看到所谓的“缓存”,那么您需要按照上面链接的answer 中的说明关闭事务。

【讨论】:

    【解决方案2】:

    几种可能性。

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

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

    还有check out this suggestion我给其他人发了邮件,他正在使用 ORM 并且遇到事务性问题,他们解决了他们的问题,却没有指出问题。也许对你有帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 2014-03-25
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-26
        相关资源
        最近更新 更多