我对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保留之前获取的数据,并且在应用程序重新启动之前不执行新查询。我该如何避免这种行为?
答案 0 :(得分:14)
调用session.expire_all()
将从会话中逐出所有数据库加载的数据。随后对对象属性的任何访问都会发出新的SELECT
语句并返回新数据。有关背景信息,请参阅http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiring。
如果您在致电expire_all()
后仍然看到所谓的“缓存”,那么您需要按照我上面链接的answer中所述关闭交易。
答案 1 :(得分:1)
一些可能性。
session
不正确或不正确的时间。最佳做法是在您提交后丢弃session
,并在使用之前的最后一刻获取新的session
。看似缓存的行为实际上可能是由于您的应用程序中session
生命周期很长。session
的对象未合并到后续echo=True
中。如果你没有将它们合并,“元数据”可能无法更新它们的状态。这更像是SQLAlchemy的ORM API的一个问题,到目前为止你还没有使用它。一个常规调试提示:如果您想确切知道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